在Pharo / Smalltalk中使用“ >>”

Gak*_*kuo 3 smalltalk pharo concurrent.futures

我正在法鲁执行期货。我偶然发现了这个网站http://onsmalltalk.com/smalltalk-concurrency-playing-with-futures。我正在关注此示例,并尝试在Pharo上复制它。但是,我到了最后一步,我不知道“ >>”是什么意思:http://rigaux.org/language-study/syntax-across- language-per-language / Smalltalk.html

BlockClosure>>future
    ^ SFuture new value: self fixTemps
Run Code Online (Sandbox Code Playgroud)

我可以看到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 
Run Code Online (Sandbox Code Playgroud)

成绩单显示以下错误,而不是预期值12。

UndefinedObject>>DoIt (value1 is Undeclared) 

UndefinedObject>>DoIt (value2 is Undeclared) 
Run Code Online (Sandbox Code Playgroud)

Lea*_*lia 6

出于某种原因,它会很容易学习,Smalltalk中有一个传统的表示法,可以m在类Cis中引用带有选择器的方法C>>m。例如,BlockClosure>>future表示BlockClosurewith选择器的方法#future。有趣的是,该表达式不是可评估的Smalltalk表达式,也就是说,它不是Smalltalk表达式。这只是一种简洁的说法,“下面是m类中方法的源代码C”。只是。

但是,在Smalltalk中,方法也是对象。实际上,它们是的实例CompiledMethod。这意味着可以通过发送消息来检索它们。在这种情况下,消息为methodAt:。消息的接收者是实现方法的类,参数是选择器(分别C与and和#mor BlockClosure#future在您的示例中)。

因此,大多数方言都实现了methodAt:named 的同义词>>。这很容易以这种方式完成:

>> aSymbol
  ^self methodAt: aSymbol
Run Code Online (Sandbox Code Playgroud)

这使Smalltalk语法更接近于传统表示法,因为现在BlockClosure>>future看起来像是将消息发送>>BlockClosure带有arguments的表达式future。但是,future是不是Symbol除非我们有预置它#,即#future。因此,如果在选择器前面加上#符号,Symbol #future则会得到文字,即有效的Smalltalk对象。现在表达

BlockClosure >> #future
Run Code Online (Sandbox Code Playgroud)

成为一条消息,并在对其进行评估后将其结果变为类中的CompiledMethodwith选择器。#futureBlockClosure

总之,BlockClosure>>future是一种表示法,不是有效的Smalltalk表达式。但是,通过将其调整为BlockClosure >> #future,它将成为该语言的可评估表达式,该语言返回表示的方法。