簡體   English   中英

Smalltalk的whileTrue消息如何在后台實現?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM