Smalltalk 中的块本身可以是 运行 吗?

Can a block in Smalltalk be run by itself?

我知道块可以通过这种方式传递和使用。

但是有没有什么方法可以调用一个块,只要有一个块?是这样的吗?

aBlock := [ ... ].
aBlock run.

我尝试在系统浏览器中搜索 BlockClosure class,但找不到。

是的,可以。此外,您将消息 'value' 发送给它以评估块,而不是 'run'。事实上,您不必将其分配给变量。你可以这样做:

[ ... ] value.

让我们补充一下,除了value,如果你的块有参数,你也可以使用

[:f | <do something with f>] value: a

其中 f 是一个 正式的 参数(一个未绑定的变量名)并且 a 是一个 actual发送 #value: 时将绑定到 f 的对象。

对于两个参数,使用 value:value:,对于多个参数,使用 valueWithArguments:,它接收一个 Array


例子

[:x | x squared - 1] value: 3
                               ->  3 squared - 1 (i.e., 8)

[:x :y | x + 2 / (y - 4)] value: 2 value: 0
                               ->  2 + 2 / (0 - 4) (i.e., -1)

运动

以下评估的结果是什么?:

block := [:x | x value: 2].
block value: [:y | y + 1]

是的!事实上,你可以用它们做一些非常有趣的事情,比如在它们内部激活它们。例如,此块计算阶乘递归调用自身:

factorialBlock := [:n | 
    n <= 1 
        ifTrue: [n]
        ifFalse: [n * (factorialBlock value: n - 1)]
]

并尝试一下:

factorialBlock value: 5

这不是一个很好的编码实践的例子,但它是块闭包的力量!

检查这个:

Pharo 中的 Lambda 微积分 是的,Y Combinator在普通程序中很有用

https://medium.com/concerning-pharo/lambda-calculus-in-pharo-a4a571869594#.2a78xp31s

来自文章:

  ycombinator := [ :f | 
  [ :g | g value: g ] value: [ :g |
    f value: [ :x | 
      (g value: g) value: x ] ] ]

这一部的力量很强。