如何在幕后实现Smalltalk的whileTrue消息?

mof*_*dub 2 smalltalk

我正在努力教自己Smalltalk.教程有一个while循环的例子:

|i| 
i:=5. 
[i >0] whileTrue:[ 
 Transcript show: ((i*2) asString) ; cr. 
 i:=i-1. 
].
Run Code Online (Sandbox Code Playgroud)

据我了解,whileTrue是发送给BlockClosure的消息,告诉接收BlockClosure运行作为参数给出的BlockClosure,只要接收器为真.

如果没有Smalltalk中的while循环结构,BlockClosure响应的whileTrue消息是如何实现的?或者它是用运行时编写的任何语言实现的?

Ash*_*son 6

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

whileTrue: aBlock

   ^self value
      ifTrue:
      [aBlock value.
      [self value] whileTrue: [aBlock value]]

但是,还有一个注意事项,如果接收器和参数都是文字块,编译器将内联一个#whileTrue:call.因此在大多数情况下,您还可以考虑#whileTrue:看起来像语法上发送的消息的"神奇"消息之一,但实际上已经优化为不同的字节码.