可以创建一个独立的 method/function(没有任何 class)

Can one create a standalone method/function (without any class)

我正在尝试了解 smalltalk。是否可以有一个独立的 method/function,它不是任何特定 class 的一部分,并且可以稍后调用:

amethod ['amethod called' printNl]. 
amethod.

以上代码给出以下错误:

simpleclass.st:1: expected Eval, Namespace or class definition

如何按照错误消息的建议使用 EvalNamespace

我试过以下但 none 有效:

Eval amethod [...
amethod Eval [...
Eval amethod Eval[...        "!"

Eval [... 有效,但我想为块命名,以便稍后调用它。

以下也有效,但会立即执行,稍后调用时不会执行。

Namespace current: amethod ['amethod called' printNl]. 

感谢您的见解。

在 Smalltalk 中,与独立方法等效的是 Block (a.k.a. BlockClosure)。您可以通过将 Smalltalk 表达式括在方括号中来创建它们。例如

[3 + 4]

要评估一个块,您向它发送消息 value:

[3 + 4] value

将回答 7

块也可以有参数:

[:s | 3 + s]

你用value:

评价他们
[:s | 3 + s] value: 4  "answers with 7"

如果块有几个句子,您可以用点将它们分开,就像在方法主体中所做的那样。


附录

Smalltalk 中的块首先是 class 个对象。特别是,可以用变量引用它们,与任何其他对象相同:

three := 3.
threePlus := [:s | three + s].

供以后使用

threePlus value: 4    "7"

块可以嵌套:

random := Random new.
compare := [:p :u | u <= p]
bernoulli60 := [compare value: 0.6 value: random next].

然后序列:

bernoulli60 value.  "true"
bernoulli60 value.  "false"
...
bernoulli60 value.  "true"

大约 60% 的时间会用 true 回答。

Leandro 的回答,尽管是正确的并且对 smalltalk 有深刻的理解,正在回答你的要求,但我认为,你不是 100% 确定,你实际上是在问如何 "play" 使用代码而不需要创建一个class.

在我看来,你想要的被称为 Workspace(Smalltalk/X 和 Dolphin)(它可以有不同的名称,例如 Pharo Smalltalk 中的 Playground) .

如果你想玩,你需要创建一个局部变量。

| result |

result := 0. "Init otherwise nil"

"Adding results of a simple integer factorial"
1 to: 10 do: [ :integer |
     result := result + integer factorial
].

Transcript show: result.

解释:

我正在使用 do: 块进行 1-10 迭代。 (:integer 是块局部变量)。接下来,我将在 Transcript.

上显示结果