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 表示法所指方法的语言的可评估表达式。
我正在 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 表示法所指方法的语言的可评估表达式。