Могут ли функции быть локальными в Юлии и что это означает? - PullRequest
1 голос
/ 15 июня 2019

Согласно репозиции Джулии с использованием Джулии 1.1, это действительно Джулия:

julia> local function f()
       5
       end
(::getfield(Main, Symbol("#f#8"))) (generic function with 1 method)

Что означает наличие локальной функции, скажем, в модуле? Это приватно или публично? Разве не все функции объявлены локальными по умолчанию для области, в которой они объявлены? И если это так, то локальное ключевое слово избыточно для функций?

1 Ответ

1 голос
/ 15 июня 2019

Что означает наличие локальной функции в скажем модуле?

Я думаю, что этот синтаксис должен быть запрещен.Не задокументировано, что он делает.Я открыл обсуждение здесь , чтобы прояснить этот вопрос.

Это приватно или публично?

Этот синтаксис - насколько я могуtell - определяет функцию, которая не введена в глобальную таблицу методов модуля.Поэтому по сути это определение похоже на определение анонимной функции, поэтому вы можете сделать что-то вроде этого:

julia> x = (local f() = 1)
(::getfield(Main, Symbol("#f#3"))) (generic function with 1 method)

julia> x()
1

Не все ли функции объявлены локальными по умолчанию для области, в которой они объявлены?

Да.Вы не можете добавлять метод в глобальную таблицу методов из локальной области.Единственный способ сделать это - использовать eval, что в общем случае не рекомендуется в обычном коде.

И в этом случае ключевое слово local является избыточным для функций?

Нет, он не является полностью избыточным, так как иногда он необходим во вложенных локальных областях (как правило, local необходим в локальных областях для любого имени переменной).См. Этот пример:

julia> function f1()
           f2() = 10
           for i in 1:2
               f2() = i
               println(f2())
           end
       end
f1 (generic function with 1 method)

julia> f1()
ERROR: UndefVarError: i not defined
Stacktrace:
 [1] f1() at .\REPL[3]:2
 [2] top-level scope at none:0

julia> function f1()
           f2() = 10
           for i in 1:2
               local f2() = i
               println(f2())
           end
       end
f1 (generic function with 1 method)

julia> f1()
1
2

РЕДАКТИРОВАТЬ

Как указано в Discourse, здесь есть объяснение этой проблемы https://github.com/JuliaLang/julia/issues/10472#issuecomment-321584501 на GitHub.

В итоге - это работает, как я и предполагал, и техническая причина заключается в том, что если Джулия видит ключевое слово local в глобальной области видимости, создается неявная локальная область действия, поэтому значения могут вытекать из этой области, но не привязываться к переменным.

...