Smalltalk 闲聊怎么样';s的信息:do:在幕后实施?

Smalltalk 闲聊怎么样';s的信息:do:在幕后实施?,smalltalk,Smalltalk,smalltalk中的一切都是一个对象,对象通过 信息 我无法理解上面的代码是如何理解消息的:do: 如何将块从1迭代到10? 它怎么知道它必须重复那么多次块 有人能解释一下引擎盖下发生了什么吗 所有Smalltalk消息都遵循模式。在这种情况下,接收器是1(编号的子实例),消息是to:do: 您可以浏览classNumber并在此处查看to:do:的实现: to:stop do:aBlock |下一个值| 下一个值:=self。 [nextValue所有Smalltalk消息都遵循模式。在这种

smalltalk中的一切都是一个对象,对象通过 信息

我无法理解上面的代码是如何理解消息的:do:

如何将块从1迭代到10? 它怎么知道它必须重复那么多次块


有人能解释一下引擎盖下发生了什么吗

所有Smalltalk消息都遵循模式
。在这种情况下,接收器是
1
(编号
的子实例),消息是
to:do:

您可以浏览class
Number
并在此处查看
to:do:
的实现:

to:stop do:aBlock
|下一个值|
下一个值:=self。

[nextValue所有Smalltalk消息都遵循模式
。在这种情况下,接收器为
1
(编号的子实例),消息为
to:do:

您可以浏览class
Number
并在此处查看
to:do:
的实现:

to:stop do:aBlock
|下一个值|
下一个值:=self。
[nextValue考虑该方法

result := String new. 
1 to: 10 do: [:n | result := result, n printString, ’ ’]. 
以下是Pharo生成的字节码

m
  1 to: 10 do: [:i | self doSomethingWith: i]
pushConstant:1;i:=1
popIntoTemp:0;
@2:pushTemp:0;我考虑该方法

result := String new. 
1 to: 10 do: [:n | result := result, n printString, ’ ’]. 
以下是Pharo生成的字节码

m
  1 to: 10 do: [:i | self doSomethingWith: i]
pushConstant:1;i:=1
popIntoTemp:0;

@2:pushTemp:0;顺便说一句,这至少在某种程度上与λ-演算中的数字Church编码有关,尽管没有Smalltalk的布尔编码密切,后者实际上是λ-演算中的布尔Church编码。在数字Church编码中,数字编码为迭代(因此,一个数字和一个循环的迭代次数是一样的),而在Smalltalk中,迭代被编码为一种数字方法。此外,在一个具有适当尾部调用的Smalltalk中,它可以通过尾部递归来实现,在你看来,这可能更优雅,也可能不那么优雅。(在我看来。)顺便说一句,这至少在某种程度上与λ-演算中的数字Church编码有关,尽管没有Smalltalk的布尔编码紧密,后者实际上是λ-演算中布尔的Church编码。在数字的Church编码中,数字编码为迭代(因此,一个数字和一个循环的迭代次数是一样的),而在Smalltalk中,迭代被编码为一种数字方法。此外,在一个具有适当尾部调用的Smalltalk中,它可以通过尾部递归来实现,在你看来,这可能更优雅,也可能不那么优雅。(在我看来。)