簡體   English   中英

在Pharo / Smalltalk中使用“>>”

[英]The use of “>>” in Pharo/Smalltalk

我正在Pharo實施期貨。 我遇到了這個網站http://onsmalltalk.com/smalltalk-concurrency-playing-with-futures 我正在關注這個例子並嘗試在Pharo上復制它。 但是,我到目前為止是最后一步,我不知道“>>”是什么意思:這個符號也不作為Smalltalk語法的一部分包含在http://rigaux.org/language-study/syntax-across-中語言 - 每語言/ Smalltalk.html

BlockClosure>>future
    ^ SFuture new value: self fixTemps

我可以看到future不是BlockClosure實現的變量或方法。 我應該如何使用這部分代碼來使承諾/期貨按照http://onsmalltalk.com/smalltalk-concurrency-playing-with-futures所示的方式工作? 我不能將它添加到Playground或作為我的Promise類的方法,或者我錯過了什么?

將未來方法添加到BlockClosure后,這是我在PlayGround上嘗試的代碼。

value1 := [200 timesRepeat:[Transcript show: '.']. 6] future.
value2 := [200 timesRepeat:[Transcript show: '+']. 6] future.
Transcript show: 'other work'.
Transcript show: (value1 + value2).
Date today 

成績單顯示以下錯誤而不是預期值12。

UndefinedObject>>DoIt (value1 is Undeclared) 

UndefinedObject>>DoIt (value2 is Undeclared) 

出於某種原因,這將是很好的學習,有在Smalltalk傳統符號來指代法選擇,比如, mCC>>m 例如, BlockClosure>>future表示的方法BlockClosure具有選擇#future 有趣的是,表達式不是可評估的Smalltalk表達式,意思是,它不是Smalltalk表達式。 這只是一種簡潔的說法,“下面是C類方法m的源代碼”。 只是。

然而,在Smalltalk中,方法也是對象。 實際上,它們是CompiledMethod實例。 這意味着可以通過發送消息來檢索它們。 在這種情況下,消息是methodAt: . 消息的接收者是實現方法的類,參數是選擇器(在您的示例中分別為C#m ,或BlockClosure#future )。

因此,大多數方言都實現了methodAt: named >>的同義詞。 這很容易通過這種方式完成:

>> aSymbol
  ^self methodAt: aSymbol

這使得Smalltalk語法更接近傳統的表示法,因為現在BlockClosure>>future看起來像是將消息>>發送到具有參數future BlockClosure的表達式。 然而, future不是Symbol除非我們用# #future ,即#future 因此,如果我們在選擇器#future加上#符號,我們得到文字Symbol #future ,它是一個有效的Smalltalk對象。 現在的表達

BlockClosure >> #future

變的消息,並且評估它的后它的結果CompiledMethod具有選擇#future在類BlockClosure

總之, BlockClosure>>future是一種表示法,而不是一個有效的Smalltalk表達式。 但是,通過將其調整為BlockClosure >> #future ,它成為一種可評估的語言表達式,它返回所引用符號的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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