Julia 为什么是复合表达式?

Julia 为什么是复合表达式?,julia,Julia,这是我正在读的一本书中的一个例子: volume = begin len = 10 breadth = 20 height = 30 len * breadth * height end 为什么我需要复合表达式??我可以只写volume=10*20*30或volume=len*width*height或为此编写函数或匿名函数 为什么要使用开始和结束?或者一个可能更好的问题:我什么时候使用它们,因为我想书中上面的例子可能不是很好。简单地说:“开始”只是表示一个代码

这是我正在读的一本书中的一个例子:

volume = begin
    len = 10
    breadth = 20
    height = 30
    len * breadth * height
end
为什么我需要复合表达式??我可以只写
volume=10*20*30
volume=len*width*height
或为此编写函数或匿名函数


为什么要使用
开始
结束
?或者一个可能更好的问题:我什么时候使用它们,因为我想书中上面的例子可能不是很好。

简单地说:“开始”只是表示一个代码块(请参阅此页上的文档:)

在上面的示例中,不清楚使用begin块与声明函数是否有任何价值


我不认为那个关键词在代码中被使用得太多,我个人也从未在实践中使用过。我的建议是,只使用一个函数,因为它会做同样的事情

我想在很多情况下都很方便,但正如您所指出的,您也可以通过其他构造(如函数等)实现类似的效果

什么可以开始。。。结束块是否用于

  • 要简单地“包含”变量及其名称:
    len
    width
    height
    将只存在于块中,而不会污染周围的命名空间
  • 将宏应用于代码块而不是单个语句。例如
    @inbounds begin(例如)。(请注意,正如注释
    begin…end
    中指出的那样,没有引入局部范围,但该参数适用于类似的
    let…end
    块。)

特别是第二点是我在代码中使用它们的原因。

这些块的一个用途是理解:

A = [ begin
           x = y^2
           x - x^2 + 2
         end
         for y = 1:5 ]

你可以做一个函数,在理解中使用它,但是有时候这很方便。每当您想在某个地方使用多行代码块时,就可以使用它,例如将其作为参数传递给宏(它通常用于测试标准库中的
@testset

来概括其他人说过的话:块允许您转换语句列表(语法“短语”)一个表达式(表示值并可以赋值的“短语”)

例如,虽然你不应该,但你可以写作

x = begin
    s = 0
    for i = 1:10
        s += i^2
    end
    s
end
x
分配给循环操作的结果。(限制序列中的最后一条语句实际上必须是表达式——否则,表达式将没有值。)

一个合法的用例是生成代码。例如,您可能会

x = @somthing bla blub
进入

对用户透明,而
@something
可以自由生成任何语言构造

或者,如果您想编写一个具有较长正文的匿名函数(并且不使用
函数
表单):


我还没有使用朱莉娅,但这正是我所想的。然而,当语言被设计时(可能是非常聪明的),人们一定有一个想法,对吧?我同意@logankilpatrick的观点,在很多情况下,你会想使用函数来代替。但我认为这些块的存在是有原因的(见我的答案)。@Georgery将一系列语句转换为表达式有时是一件有用的事情(参见LISP中的
progn
)。正如你正确指出的那样,在上下文中,这似乎是毫无意义的。我也不得不让自己放心,但是
开始
块。另一方面,它们将一系列语句转换为表达式,如果您使用宏/从宏生成代码,这将非常方便。哦,谢谢,在这方面,我把它与
let。。。结束
,它确实引入了本地范围。我会纠正我的答案。我一直在做同样的错误假设:)这正是人们所期望的。@crstnbr你的第一颗子弹仍然是误导性的。似乎还是说
begin
块引入了一个局部范围。那是什么书?正如你所说,这个例子并不是特别好的“学习朱莉娅”,这里有:(第127页)不是为了反对你的观点,但是在这种情况下,你可以写
y^2-y^4+2
。也许最好给出一个真正需要两个(或更多)步骤的例子。@crstnbr你是对的,但我刚开始使用了书中的例子,只是对合理的用法很感兴趣。比如,为了节省两次计算一些昂贵的中间值的时间。稍微澄清一下:在Julia中,语句确实有值,并且可以赋值。所以你可以在1:2结束时为i做
x=y=1
a=if false end
,和
b=for i
,然后
x
有值
1
a
b
都有值
nothing
,下面是一个分配
if-else
语句值的更有用的示例:
a=if-false;1其他2结束
。在本例中,
a
等于
2
。对,它们有值,并且在技术上也是表达式。赋值是一个表达式,因为它基本上是
setproperty/
设置索引,而且它“传统上”有一个值(在类似C的语言中)。对于
if-else
,也一样,这是两种语言中的一个表达式。但是对于
如果
没有
其他的“默认”值为无,我认为这仅仅是一个工件。
x = begin
   (stuff involving bla and blub)
end
f = x -> begin
   ...
end