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

浪子不回头ぞ 提交于 2019-12-10 21:31:57

问题


I am trying to understand smalltalk. Is it possible to have a standalone method/function, which is not part of any particular class, and which can be called later:

amethod ['amethod called' printNl]. 
amethod.

Above code gives following error:

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

How can I use Eval or Namespace as being suggested by error message?

I tried following but none work:

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

Eval [... works but I want to give a name to the block so that I can call it later.

Following also works but gets executed immediately and does not execute when called later.

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

Thanks for your insight.


回答1:


In Smalltalk the equivalent to a standalone method is a Block (a.k.a. BlockClosure). You create them by enclosing Smalltalk expressions between square brackets. For example

[3 + 4]

To evaluate a block, you send it the message value:

[3 + 4] value

which will answer with 7.

Blocks may also have arguments:

[:s | 3 + s]

you evaluate them with value:

[:s | 3 + s] value: 4  "answers with 7"

If the block has several sentences, you separate them with a dot, as you would do in the body of a method.


Addendum

Blocks in Smalltalk are first class objects. In particular, one can reference them with variables, the same one does with any other objects:

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

for later use

threePlus value: 4    "7"

Blocks can be nested:

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

Then the sequence:

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

will answer with true about 60% of the times.




回答2:


Leandro's answer, altough being correct and with deep smalltalk understanding, is answering what you asked for, but I think, not 100% sure thou, you are actually asking how to "play" around with a code without the need to create a class.

In my eyes want you want is called a Workspace (Smalltalk/X and Dolphin) (it can have different names like Playground in Pharo Smalltalk).

If you want to play around you need to create a local variable.

| 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.

Explanation:

I'm using a do: block for 1-10 iterration. (:integer is a block local variable). Next I'm, showing the result on Transcript.



来源:https://stackoverflow.com/questions/55931290/can-one-create-a-standalone-method-function-without-any-class

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!