无法在 GNU Smalltalk 中调用“函数”

Dmi*_*iyM 1 smalltalk gnu-smalltalk

我想定义块并以这种方式调用它:

add := [ :a :b |
    ^(a+b).
].

n := add value: 1 value: 2.
Run Code Online (Sandbox Code Playgroud)

但是当我尝试时,我收到一个错误:

$ gst 3.1.st 
Object: 3 error: return from a dead method context
SystemExceptions.BadReturn(Exception)>>signal (ExcHandling.st:254)
SystemExceptions.BadReturn class(Exception class)>>signal (ExcHandling.st:151)
SmallInteger(Object)>>badReturnError (Object.st:1389)
UndefinedObject>>executeStatements (3.1.st:3)
Run Code Online (Sandbox Code Playgroud)

如何调用 GNU Smalltalk 中的函数?

好吧,我删除了 return 语句,并且这段代码工作正常。但是当我尝试定义更复杂的函数时,例如:

nod := [ :a :b |
    (a=b) ifTrue: [a].
    (a>b) ifTrue: [nod value: (a-b) value: b].
    (a<b) ifTrue: [nod value: a value: (b-a)].
].

n := nod value: 1 value: 2.
n printNl.
Run Code Online (Sandbox Code Playgroud)

它打印为零。如果我用“提前退出”来定义:

nod := [ :a :b |
    (a=b) ifTrue: [^a].
    (a>b) ifTrue: [nod value: (a-b) value: b].
    (a<b) ifTrue: [nod value: a value: (b-a)].
].

n := nod value: 1 value: 2.
n printNl.
Run Code Online (Sandbox Code Playgroud)

它给了我同样的错误:从死方法上下文返回。

我用这种方式解决这个问题:

nod := [ :a :b |
    (a=b) ifTrue: [
        a
    ] ifFalse: [
        (a>b) ifTrue: [nod value: (a-b) value: b] ifFalse: [nod value: a value: (b-a)].
    ]
].

n := nod value: 1 value: 2.
n printNl.
Run Code Online (Sandbox Code Playgroud)

但我认为,这不是一个美丽的方式。

Oak*_*Oak 5

从代码中删除 return 语句 ( ^),它将正常工作。

在smalltalk中,返回退出出现return语句的方法。例如,它用于提前退出a < b ifTrue: [^a] ifFalse:[^b]

在这种情况下,您不希望块退出包含方法,您只希望它在发送时评估为某些内容value:value:。块的计算结果是其中的最后一个语句,因此只需将其设为常规语句即可。

顺便说一句,您收到的错误消息也解释了问题:您试图3从已经死亡的方法返回。