[SML 7594] Re: 第9回Smalltalk勉強会@京都
Shozo TAKEOKA
take @ takeoka.net
2009年 7月 4日 (土) 13:14:25 JST
> もうひとつ「一時変数と言って良いのか?」と考えることになる例を書いて
一般的に、クロージャ中にバインドされている変数は、
一時変数と言えないと思います。
「一時変数」という言葉の定義によりますが、
通常は、
一時変数は、その寿命(エクステント)は、関数(手続き)から抜けた時に、消滅するもの
と思われていると思います。
クロージャ中に保持されている変数は、スコープは局所的ですが、
エクステントは、クロージャの存在と同じなので、
一般的に言われている「一時変数」ではない、と思いますし、
通常「一時変数」と呼ばないと思います。
たけおか
2009/7/3 濱崎治 <osamu.hamasaki @ gmail.com>:
> 濱崎です。
>
> 2009/07/02 15:39 AOKI Atsushi <atsushi @ cc.kyoto-su.ac.jp>:
>>
>> 青木@京都上賀茂です。
>
> <中略>
>>
>> 実行算法(アルゴリズム)と実行環境(コンテクスト)の双方を閉
>> 包するブロッククロージャは、様々な常識的な定義の再考察を迫っ
>> てきます。たとえば、一時変数の説明の言い回しも考え直さねばな
>> らんなぁ〜、とね。
>
>
> もうひとつ「一時変数と言って良いのか?」と考えることになる例を書いて
> みました。
> まずは下準備で、ワークスペースで以下のプログラムを実行して下さい。
> 3つのワークスペース変数を用意します。
> | aWorkbook |
> aWorkbook := ScheduledControllers activeController model.
> aWorkbook addLocal: #ResetBlock.
> aWorkbook addLocal: #IncrementBlock.
> aWorkbook addLocal: #DecrementBlock
>
> 次に、同じワークスペースで以下のプログラムを実行して下さい。
> 3つのブロッククロージャを作って先ほど用意したワークスペース変数に
> 束縛します。
> | x |
> ResetBlock :=
> [x := 0.
> Transcript show: x printString].
> IncrementBlock :=
> [x := x + 1.
> Transcript space; show: x printString].
> DecrementBlock :=
> [x := x - 1.
> Transcript space; show: x printString]
>
> 次に、また同じワークスペースで以下のプログラムを実行して下さい。
> 三歩進んで二歩下がる数の列をトランスクリプトに表示するプログラムですが、
> 一時変数 x に関し、このプログラムで用意した物と、ブロッククロージャの中で
> 使われている物は、全く縁が切れているのがお分かり頂けると思います。
> | x |
> Transcript clear.
> ResetBlock value.
> x := 100.
> 2 timesRepeat: [
> 3 timesRepeat: [IncrementBlock value].
> 2 timesRepeat: [DecrementBlock value]].
> Transcript cr; show: x printString.
> 2 timesRepeat: [
> 3 timesRepeat: [IncrementBlock value].
> 2 timesRepeat: [DecrementBlock value]]
>
> 最後に、同じワークスペースで以下のプログラムを実行して下さい。
> 後始末をします。
> | aWorkbook anEnvironment |
> aWorkbook := ScheduledControllers activeController model.
> anEnvironment := aWorkbook doItEnvironment.
> #(#ResetBlock #IncrementBlock #DecrementBlock)
> do: [:each | anEnvironment removeKey: each].
> Transcript clear
> 以上です。
> ------------
>
> Osamu Hamasaki
>
>
SML メーリングリストの案内