当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在幕后实现Smalltalk的whileTrue消息?》经验,为你挑选了1个好方法。

我正在努力教自己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消息是如何实现的?或者它是用运行时编写的任何语言实现的?



1> Ash Wilson..:

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

whileTrue: aBlock

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

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

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有