Smalltalk怎么样;在幕后实现了什么消息?

Smalltalk怎么样;在幕后实现了什么消息?,smalltalk,Smalltalk,我在努力自学说闲话。具有以下while循环示例: |i| i:=5. [i >0] whileTrue:[ Transcript show: ((i*2) asString) ; cr. i:=i-1. ]. 据我所知,whileTrue是发送给BlockClosure的消息,告诉接收BlockClosure运行作为参数给出的BlockClosure,只要接收方为true BlockClose响应的whileTrue消息在Smalltalk中如何实现而不使用while循环构

我在努力自学说闲话。具有以下while循环示例:

|i| 
i:=5. 
[i >0] whileTrue:[ 
 Transcript show: ((i*2) asString) ; cr. 
 i:=i-1. 
].
据我所知,whileTrue是发送给BlockClosure的消息,告诉接收BlockClosure运行作为参数给出的BlockClosure,只要接收方为true


BlockClose响应的whileTrue消息在Smalltalk中如何实现而不使用while循环构造?或者它是用运行时编写的任何语言实现的?

根据这一点,真相不是真正的消息。

在我的VisualWorks图像中,它是通过递归完成的:

whileTrue: aBlock ^self value ifTrue: [aBlock value. [self value] whileTrue: [aBlock value]] whileTrue:aBlock ^自我价值 如果是: [A锁定值。 [自我价值]而真实:[锁定价值]]
但是,还有一点需要注意,如果接收方和参数都是文本块,编译器将内联a#whileTrue:call。因此,在大多数情况下,您也可以考虑“真”:一个“神奇”的消息,看起来像是一个语法上发送的消息,但实际上被优化到引擎盖下的不同字节码。

< P>正如已经提到的:编译器在我所知道的所有实现中欺骗和内联。因此,在正常情况下,实际上不需要存在该方法,并且通常不会调用它。 但是,当执行或解释动态生成的代码结构而不实际使用编译器时,该方法可能很有用

顺便说一句,由于Smalltalk语言标准(实际上并不存在)并不强制实现尾部调用消除(例如,与Scheme相反),VW中的递归实现对于执行或解释并不真正有用(除非编译器欺骗被标准化)

没有递归的替代方案可以是:

whileTrue:aBlock
    self value ifFalse:[^ nil].
    aBlock value.
    thisContext restart

我认为这可能与递归有关,但我怀疑一个看似基本的“构造”是以一种可能代价高昂的方式实现的;实际上,这不是一个问题,因为您永远不需要重新定义这些基本方法。这有点像杜鲁门秀,《太阳报》实际上是一台投影机,因为预算中没有考虑到实际的明星:)实现必须像真正的消息一样存在,因为您可以执行“aClosure perform:#whileTrue”,它确实会使用正常的消息调度,并最终以那里编写的代码结束。但好的是,随后触发的代码正确地使用了“神奇”定义。