Smalltalk中的块可以自行运行吗?

时间:2017-01-13 02:41:38

标签: smalltalk

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

但是有没有办法调用块,只需要一个块?像这样的东西?

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

我尝试在系统浏览器中搜索BlockClosure类,但无法找到它。

4 个答案:

答案 0 :(得分:4)

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

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

并试一试:

factorialBlock value: 5

这不是一个非常好的编码实践的例子,但它具有块闭包的功能!

答案 1 :(得分:3)

是的,它可以。此外,您将消息“值”发送给它以评估块,而不是“运行”。实际上,您不必将其分配给变量。你可以这样做:

[ ... ] value.

答案 2 :(得分:3)

让我们在value之外添加,如果你的块有参数,你也可以使用

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

其中f正式参数(未绑定的变量名称),而a实际的对象,它将绑定到{{1发送f时。

对于两个参数,使用#value:和许多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)

答案 3 :(得分:1)

检查一下:

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 ] ] ]

这一力量很强。