Есть ли тонкие различия между однострочными и многострочными выражениями в Юлии? - PullRequest
1 голос
/ 10 июля 2019

Я использую Julia 1.1.1 и обнаружил вчера что-то интересное.

Минимальный пример ниже

Рассмотрим следующий код:

julia> if ((true)) true else false end
true

Работает как задумано

Однако при попытке сделать следующее:

julia> function foo()
         true
       end
foo (generic function with 1 method)
julia> if ((foo())) (true,false) else (false,true) end
ERROR: syntax: space before "(" not allowed in "foo() ("
julia>

Однако при написании выражения стандартным способом оно, похоже, работает

julia> if ((foo()))
         (true, false)
       else
         false
       end
(true, false)

julia>

Насколько я понимаю из следующего поста Есть ли у Джулии троичный условный оператор? Мне должно быть разрешено писать, если выражения во многом аналогичны троичным, и я обычно могу. Однако для этого случая троичный оператор, кажется, работает как задумано, но не выражение if

julia>  ((foo())) ? (true,false) : (false,true)
(true, false)

Существует ли тонкая разница между ними?

Как отмечено в комментариях crstnbr, допустим следующий синтаксис:

if ((foo())) true,false else false,true end 

1 Ответ

1 голос
/ 10 июля 2019

Похоже, это не имеет никакого отношения к блоку if как таковому.Это просто синтаксическая ошибка.

По сути, julia запрещает синтаксис myfun (args) при вызове функции (т. Е. Между именем функции и скобками не должно быть пробелов).

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

Например, обратите внимание, что:

julia> foo()()
ERROR: MethodError: objects of type Bool are not callable
Stacktrace:
[1] top-level scope at none:0

, тогда как

julia> foo() ()
ERROR: syntax: space before "(" not allowed in "foo() ("

Кроме того, как я уже упоминал в своем комментарии выше, независимо от вышесказанного, я лично считаю такие краткие блоки if очень плохим стилем, а также плохой идеей, посколькуты сам только что разобрался.Если вы не хотите разбивать на строки, все равно хорошая идея, и гораздо более удобочитаемая, использовать точку с запятой в конце соответствующих операторов, чтобы показать четкое разделение (как для себя, читающего код, так и для интерпретатора).).

т.е.

if true; true, false; else; false, true; end
if foo(); true, false; else; false, true; end
...