为什么在这些 julia 函数中不尊重 constness?

Why is constness not respected inside these julia functions?

今天早些时候由 问题提示:

a.

julia> function f1(x::Float64) 
         const y = x;
         y = "This should throw an error since y is of constant type";
         return y;
       end
f1 (generic function with 1 method)

julia> f1(1.0)
"This should throw an error since y is of constant type"

为什么 const 关键字在这里没有按预期工作? (即,不允许将已声明为 const 的字符串分配给 y)。

b.

julia> function f2(x::Float64)
         show(x);
         const x = 1.;
       end
f2 (generic function with 1 method)

julia> f2(1.0)
ERROR: UndefVarError: x not defined
Stacktrace:
 [1] f2(::Float64) at ./REPL[1]:2

为什么在行 3 上将 x 定义为 const 会影响 [=17= 的值] 线上 2?

c.

特别是,这会阻止我做:

function f(x::Float64)
  const x = x; # ensure x cannot change type, to simulate "strong typing"
  x = "This should throw an error";
end

我打算提供这个作为模拟 "strong typing" 的方式,关于 Lyndon 的 ,但它适得其反,因为这个函数在第 2 行而不是第 3 行中断正如我所料。

是什么导致了这种行为?这会被视为错误或故意行为吗?

抛开命名约定,是否有更可接受的方法来防止传递给函数的参数改变其类型?
(如,是否有定义和适当的方法来执行此操作:我不是在寻找解决方法,例如创建一个将 x 转换为不可变类型的包装器等)

编辑:

到目前为止,这是唯一允许我在函数中强制执行常量的变体,但它仍然需要引入新的变量名:

julia> function f(x::Float64)
         const x_const::Float64 = x;
         x_const = "helle"; # this will break, as expected
       end

但即便如此,错误只是抱怨 "invalid conversion from string to float" 而不是 "invalid redefinition of a constant"

因为 const 在本地范围内尚未实现:

https://github.com/JuliaLang/julia/issues/5148