[英]How is Smalltalk's whileTrue message implemented behind the scenes?
我正在嘗試自學Smalltalk。 教程中有一個while循環示例:
|i|
i:=5.
[i >0] whileTrue:[
Transcript show: ((i*2) asString) ; cr.
i:=i-1.
].
據我了解,whileTrue是一條發送到BlockClosure的消息,告訴接收者BlockClosure運行只要參數為true的BlockClosure,只要接收者為true。
在Smalltalk中沒有while循環構造的情況下,如何實現BlockClosure響應的whileTrue消息? 還是用運行時編寫的任何語言實現?
在我的VisualWorks映像中,它是通過遞歸完成的:
whileTrue: aBlock ^self value ifTrue: [aBlock value. [self value] whileTrue: [aBlock value]]
但是,還需要注意的是,如果接收方和參數都是文字塊,則編譯器將內聯#whileTrue:調用。 因此,在大多數情況下,您還可以考慮#whileTrue:“魔術”消息之一,看起來像是句法發送的消息,但實際上已在后台優化為不同的字節碼。
如前所述:編譯器在我所知的所有實現中都作弊和內聯。 因此,實際上不需要在正常情況下使用該方法,並且通常不會調用該方法。 但是,當在不實際使用編譯器的情況下執行或解釋動態生成的代碼結構時,該方法可能有用。
順便說一句,由於Smalltalk語言標准(實際上不存在)不會強制實現消除尾部調用(例如,與Scheme相比),因此VW中的遞歸實現對於執行或解釋並沒有真正的用處(除非對編譯器作弊進行了標准化)。
沒有遞歸的替代方法可能是:
whileTrue:aBlock
self value ifFalse:[^ nil].
aBlock value.
thisContext restart
根據該論壇的說法,True不是真實的消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.