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 ] ] ]
这一部的力量很强。
我知道块可以通过这种方式传递和使用。
但是有没有什么方法可以调用一个块,只要有一个块?是这样的吗?
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 ] ] ]
这一部的力量很强。