我正在努力教自己Smalltalk.教程有一个while循环的例子:
|i| i:=5. [i >0] whileTrue:[ Transcript show: ((i*2) asString) ; cr. i:=i-1. ].
据我了解,whileTrue是发送给BlockClosure的消息,告诉接收BlockClosure运行作为参数给出的BlockClosure,只要接收器为真.
如果没有Smalltalk中的while循环结构,BlockClosure响应的whileTrue消息是如何实现的?或者它是用运行时编写的任何语言实现的?
在我的VisualWorks图像中,它是通过递归完成的:
whileTrue: aBlock ^self value ifTrue: [aBlock value. [self value] whileTrue: [aBlock value]]
但是,还有一个注意事项,如果接收器和参数都是文字块,编译器将内联一个#whileTrue:call.因此在大多数情况下,您还可以考虑#whileTrue:看起来像语法上发送的消息的"神奇"消息之一,但实际上已经优化为不同的字节码.