我正在使用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>
根据我对以下帖子Does Julia have a ternary conditional operator?的理解,应该允许我以与三进制几乎相同的方式编写表达式,而我通常可以这样做。但是,在这种情况下,三元运算符似乎可以按预期运行,但if表达式则无法运行
julia> ((foo())) ? (true,false) : (false,true)
(true, false)
两者之间是否存在微妙的差异?
如crstnbr的注释中所述,允许使用以下语法:
if ((foo())) true,false else false,true end
答案 0 :(得分:1)
这似乎与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