如果Julia中的表达式在单行和多行之间存在微妙的区别?

时间:2019-07-10 12:41:14

标签: julia

我正在使用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 

1 个答案:

答案 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