Почему постоянство не соблюдается внутри этих функций Юлии?


Подсказано вопросом Линдона ранее сегодня:

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 здесь работает не так, как ожидалось? (то есть запретить присвоение строки y, которая была объявлена как const).

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

Почему определение x как const в строке 3 влияет на значение x в строке 2?

С.

В частности, это мешает мне делать:

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

Я собирался предложить это как способ симуляции "сильной типизации", в отношении комментария Линдона "контрпримера" , но это обернулось против меня, так как эта функция прерывается в строке 2, а не в строке 3, Как я ожидал.

Что вызывает такое поведение? Будет ли это считаться ошибкой или преднамеренным поведением?

Помимо соглашений об именовании, существует ли более приемлемый способ предотвратить передачу аргумента в функцию от имея свой тип изменили?
(например, есть ли определенный и подходящий способ сделать это: я не ищу обходных путей, например, создание оболочки, которая преобразует x в неизменяемый тип и т. д.)

Редактировать:

Пока это единственный вариант, который позволяет мне применять константу в функции, но он все еще требует введения нового имени переменной:

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

Но даже тогда ошибка просто жалуется на " недопустимое преобразование строки в float" вместо "недопустимого переопределения константы"

1 3

1 ответ:

Потому что const в локальной области еще не реализовано:

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