Smalltalk是否有闭包?

问题描述

| 如果它具有闭包,是否可以假定可以在其中使用许多强大的功能样式技术?     

解决方法

        是的,Smalltalk已关闭。以下代码创建一个闭包,该闭包返回其两个参数的总和:
sum := [ :a :b | a + b ].
闭包是可以实例化,传递和操纵的对象。要评估闭包,请发送
value
value:
value:value:
,...
sum value: 1 value: 2.
闭包主要与集合一起使用,以迭代,过滤,映射...集合的所有值:
aCollection select: [ :each | each isOdd ].
aCollection inject: 0 into: [ :each :result | each + result ].
此外,它们还用于控制结构,例如循环:
[ iterator hasNext ]
    whileTrue: [ iterator next ].
1 to: 10 do: [ :each | ... ].
另外,条件使用闭包来实现:
condition
   ifTrue: [ do this ]
   ifFalse: [ do that ]
    ,        Pharo有它们:   所有虚拟机都需要关闭支持   获取最新图片
makeAdder := [ :x | [ :y | x + y ]].
add2 := makeAdder value: 2.
add2 value: 3.
返回
5
。 但请注意
makeCounter := [ :init | [ init := init + 1. init ]].
不会起作用(
Cannot store into ->init …
),例如在CL中:
CL-USER> ((lambda (init) (lambda () (incf init))) 0)
#<COMPILED-LEXICAL-CLOSURE #xC7A495E>
CL-USER> (funcall *)
1
CL-USER> (funcall **)
2
CL-USER> (funcall ***)
3
如果我没记错的话,这在引入新的闭包编译器之前就可以使用。我不确定为什么它不能与新的编译器一起使用。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...