>"的使用-6ren"> >"的使用-我正在 Pharo 实现 future 。我偶然发现了这个网站 http://onsmalltalk.com/smalltalk-concurrency-playing-with-futures .我-6ren">
gpt4 book ai didi

smalltalk - Pharo/Smalltalk中 ">>"的使用

转载 作者:行者123 更新时间:2023-12-01 10:22:13 24 4
gpt4 key购买 nike

我正在 Pharo 实现 future 。我偶然发现了这个网站 http://onsmalltalk.com/smalltalk-concurrency-playing-with-futures .我正在关注这个例子并试图在 Pharo 上复制它。但是,我在最后一步走到了这一步,我不知道“>>”是什么意思:在 http://rigaux.org/language-study/syntax-across-languages-per-language/Smalltalk.html 中,此符号并未作为 Smalltalk 语法的一部分包含在内。 .

BlockClosure>>future
^ SFuture new value: self fixTemps

我可以看到 future 不是 BlockClosure 实现的变量或方法。我应该如何处理这部分代码以使 promise / future 如 http://onsmalltalk.com/smalltalk-concurrency-playing-with-futures 所示那样工作?我无法将它添加到 Playground 或作为我的 Promise 类的方法,或者我错过了什么?

将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在类 C这是 C>>m .例如,BlockClosure>>future表示BlockClosure的方法带选择器 #future .有趣的是,该表达式不是可评估的 Smalltalk 表达式,也就是说,它不是 Smalltalk 表达式。简单来说,“下面是类m中方法C的源代码”。只是。

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

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

>> aSymbol
^self methodAt: aSymbol

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

成为一条消息,评估它后的结果, CompiledMethod带选择器 #future在类(class) BlockClosure .

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

关于smalltalk - Pharo/Smalltalk中 ">>"的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49960789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com