Я хочу, чтобы определить блок и назвать его таким образом:Невозможно вызвать «функцию» в GNU Smalltalk
add := [ :a :b |
^(a+b).
].
n := add value: 1 value: 2.
Но когда я пытаюсь это, я получаю сообщение об ошибке:
$ 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)
Как можно ли вызвать функцию в 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.
Он печатает ноль. И если я определяю с помощью «раннего выхода»:
Это дает мне ту же ошибку: возврат из контекста мертвых методов.
Я решить эту проблему таким образом:
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.
Но я думаю, это не красивый способ.
Для удовольствия, вы можете играть с Somthing как этот HTTP: // StackOverflow.com/questions/7547750/smalltalk-block-can-i-explicitly-set-the-return-value-and-stop-executing-th/11532045 # 11532045 –