[SML 7602] Re: クロージャ

濱崎治 osamu.hamasaki @ gmail.com
2009年 7月 5日 (日) 16:24:24 JST


濱崎です。
2009/07/05 6:39 Hiroshi Umeoka <umrlazybind @ gmail.com>:

> おはようございます、梅岡です。

<中略>

>
> amount
> がインスタンス変数のように機能しますね。まるでブロックがオブジェクトのように振る舞っています。クロージャって面白いっ、と単純に思いました。


梅岡さんの提示された例題を見て、ふと「こんなこと出来るかなあ」と思いついて
やってみたら上手く動いたので、ご紹介します。

-------------- ここから -----------------

| accountCreater anAccount newBlockCreater newBlock method |
accountCreater :=
[:initialBalance |
| balance |
balance := initialBalance.
(Dictionary new)
at: #withdraw
put:
[:amount |
balance := balance - amount.
balance yourself];
at: #deposit
put:
[ :amount |
balance := balance + amount.
balance yourself];
at: #balance
put:
[balance yourself];
yourself].

anAccount := accountCreater value: 1000.
Transcript clear.
Transcript cr; show: (anAccount at: #balance) value printString.
Transcript cr; show: ((anAccount at: #withdraw) value: 500) printString.
Transcript cr; show: ((anAccount at: #deposit) value: 300) printString.

newBlockCreater :=
[| balance |
[balance := 0.
balance yourself]
yourself].

newBlock := newBlockCreater value.
method := newBlock method.
newBlock
setMethod: method
outerContext: (anAccount at: #balance) outerContext
copiedValues: (anAccount at: #balance) copiedValues.
anAccount at: #reset put: newBlock.

Transcript cr; show: (anAccount at: #reset) value printString.
^anAccount

-------------- ここまで -----------------

以前のSmalltalk勉強会@京都で、「クラスがメソッドを保持しているのは、
メモリの節約のためで」なんていうお話がありましたが、このプログラムでは
オブジェクト自身がメソッドを持っていて、さらにオブジェクトを生成した後に
メソッドを追加しています。がんばって書けば、インスタンス変数(?)を追加
することも恐らく可能だと思います。

-- 

Osamu Hamasaki
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: http://www.smalltalk.jp/pipermail/sml/attachments/20090705/0ef71b45/attachment.htm


SML メーリングリストの案内