“的使用&燃气轮机&燃气轮机&引用;在Pharo/Smalltalk中

“的使用&燃气轮机&燃气轮机&引用;在Pharo/Smalltalk中,smalltalk,pharo,concurrent.futures,Smalltalk,Pharo,Concurrent.futures,我正在法罗实施未来计划。我偶然发现了这个网站。我遵循这个示例,并尝试在Pharo上复制它。但是,在最后一步中我说到了这一点,我不知道“>>”是什么意思:这个符号也没有作为Smalltalk语法的一部分包含在中 我可以看出future不是一个变量,也不是一个由BlockClosure实现的方法。我应该如何处理代码的这一部分,以使承诺/未来工作如中所示?我不能把它添加到操场上,也不能把它作为我的承诺课程的一种方法,或者我遗漏了什么 在将future方法添加到BlockClosure之后,这就是我在操

我正在法罗实施未来计划。我偶然发现了这个网站。我遵循这个示例,并尝试在Pharo上复制它。但是,在最后一步中我说到了这一点,我不知道“>>”是什么意思:这个符号也没有作为Smalltalk语法的一部分包含在中

我可以看出future不是一个变量,也不是一个由BlockClosure实现的方法。我应该如何处理代码的这一部分,以使承诺/未来工作如中所示?我不能把它添加到操场上,也不能把它作为我的承诺课程的一种方法,或者我遗漏了什么

在将future方法添加到BlockClosure之后,这就是我在操场上尝试的代码

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
在class
C
中,也就是
C>>m
。例如,
BlockClosure>>future
表示使用选择器
#future
进行
BlockClosure
的方法。有趣的是,这个表达式不是可计算的Smalltalk表达式,也就是说,它不是Smalltalk表达式。这只是一种简洁的说法,“下面是class
C
中方法
m
的源代码。”。就这样

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

因此,大多数方言实现了名为
>
的同义词
methodAt:
。这很容易通过以下方式实现:

>> aSymbol
  ^self methodAt: aSymbol
这使Smalltalk语法更接近于传统的表示法,因为现在
BlockClosure>>future
看起来像是一个表达式,它将消息
>
发送到
BlockClosure
,并带有参数
future
。然而,
未来
不是一个
符号
,除非我们在它前面加上
,即
#未来
。因此,如果我们在选择器前面加上
符号,就会得到文本
符号
\future
,这是一个有效的Smalltalk对象。现在是表达式

BlockClosure >> #future
在类
BlockClosure
中使用选择器
#future
CompiledMethod
将成为一条消息及其评估后的结果


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

我将future方法添加到BlockClosure中。但是,“^S未来新值:self-fixTemps”似乎不起作用,因为fixTemps消息是“发送但未实现”。我看了这个网站。这是关于fixTemps的说明:fixTemps:-这应该修复块中使用的临时变量的值,这些临时变量通常与定义块的方法共享。还没有定义,但它不是有害的。接电话。它说“尚未定义”。如何解决这个问题?@Gakuo您不需要Pharo中的
fixTemps
。只需发送
self
作为参数。在去掉fixtemp之后,我尝试运行网站上给出的测试代码。我得到一个错误:“UndefinedObject>>DoIt(value1未声明)”和“UndefinedObject>>DoIt(value2未声明)”。我希望这段代码能够按照@Gakuo网站上的指示工作,变量
value1
value2
被定义为
SFuture
的实例,因此如果您计算这些表达式,这些变量将被声明。事实上,您得到的是未申报的作业,这意味着您尚未评估这些作业。至少,这是我唯一能想象不到你在做什么的事情。我相信这一定是其他原因。我一次执行每一行(ctrl-D),并尝试一次执行整个测试。调试器弹出,转录本显示两种情况下的“UndefinedObject>>DoIt(value1未声明)”和“UndefinedObject>>DoIt(value2未声明)”。
BlockClosure >> #future