[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 メーリングリストの案内