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)
出于某种原因,它会很容易学习,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,它将成为该语言的可评估表达式,该语言返回表示的方法。