Pharo/Smalltalk中“>>”的使用

The use of ">>" in Pharo/Smalltalk

我正在 Pharo 中实施期货。我发现了这个网站 http://onsmalltalk.com/smalltalk-concurrency-playing-with-futures. I am following this example and trying to replicate it on Pharo. However, I get to this point the last step and I have no idea what ">>" means: This symbol is not also included as part of Smalltalk syntax in http://rigaux.org/language-study/syntax-across-languages-per-language/Smalltalk.html

BlockClosure>>future
    ^ SFuture new value: self fixTemps

我可以看到 future 不是 BlockClosure 实现的变量或方法。我应该如何处理这部分代码才能使 promises/futures 按 http://onsmalltalk.com/smalltalk-concurrency-playing-with-futures 指示的那样工作?我无法将它添加到 Playground 上或作为方法添加到我的 Promise class 中,还是我遗漏了什么?

将future方法添加到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 中有一个传统的符号来引用带有选择器的方法,例如,m in class C which是 C>>m。例如,BlockClosure>>future 表示方法 BlockClosure 与选择器 #future。有趣的是,该表达式不是可评估的 Smalltalk 表达式,也就是说,它不是 Smalltalk 表达式。这只是一种简洁的说法,"what comes below is the source code of method m in class C"。就是这样。

然而,在 Smalltalk 中,方法也是对象。事实上,它们是 CompiledMethod 的实例。这意味着可以通过发送消息来检索它们。在这种情况下,消息是 methodAt:。消息的接收者是实现方法的class,参数是选择器(分别是C#m,或者BlockClosure#future你的例子)。

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

>> aSymbol
  ^self methodAt: aSymbol

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

BlockClosure >> #future

成为一条消息,对其求值后的结果, CompiledMethod 和 class BlockClosure.

中的选择器 #future

总之,BlockClosure>>future 是一个符号,不是一个有效的 Smalltalk 表达式。但是,通过将其调整为 BlockClosure >> #future,它成为 returns 表示法所指方法的语言的可评估表达式。