[前][次][番号順一覧][スレッド一覧][生データ]

langsmith:78

From: MAEDA Atusi <maeda-langsmith atusi.org>
Date: Tue, 13 Jul 2004 15:07:48 +0900
Subject: [langsmith:78] Re: 変更可能なclosure変数、対、static変数

前田敦司と申します。

Schemeの仮想マシン式インタプリタや、GCの研究をしています。

Tsuguo MOGAMI <mogami brain.riken.go.jp> writes:

> それはclosureでcloseした変数を
> 変更可能にするか、変更不能にするかです。
> 
> 実装の簡単さからいっても、有用さ便利さから言っても
> 変更可能なclosureがいいのですが、以下の点から言って気に入りません。

closureってのは、オブジェクト指向言語でいうオブジェクトと非常に似てい
ますよね。(これを最初に指摘したのはSchemeの設計者のGuy SteeleとGerald
Sussmanだと思います。Steeleは「Actorを作ってみようとしたらSchemeが出来
た」とある講演で言ってました。また、"Lambda: the Ultimate Declarative"
という論文の中の"Actors ≡ Closures (mod syntax)"という章で、オブジェ
クトをclosureで実装する手法を述べています。もしご興味があれば、
http://library.readscheme.org/page1.html からダウンロードできます。)

(define (make-cons x y)
  (lambda (message . args)
    (case message
      ((car) x)
      ((cdr) y)
      ((pair?) #t)
      ((set-car!) (set! x (car args)))
      ...)))
とか。

closed variableをインスタンス変数だと思えば、変更可能にするのはまあ自
然かな、と思います。

また、たぶんもっと古くからの使用例として、Lispでは、"generator
function"という、呼ぶたびに値の変わる関数を作るのによくclosureを使って
ました。乱数列とか、素数の列とか、あるいはストリームを扱う時とか。

staticだと、同じ記憶域を共有してしまいますから、列を複数扱えなくて不便
ですね。

generator functionのかわりにlazyなストリームとかを使えば、副作用を陽に
使わないで書くこともできますが、Lispでやるとlazinessの実装自体に副作用
を(効率上)使わざるを得なかったりします。

たとえば(delay exp)を

(let ((evaluated? #f)
      (value "not evaluated yet"))
  (lambda ()
     (if (not evaluated?) (set! value exp))
     value))
と実装したりとか。(評価した結果をキャッシュしておかないと、遅くて使い
ものになりません。この副作用は、Haskellみたいな言語だと処理系自体に組
み込まれていてプログラマは見ないですむのですが。)

===========

ところで、Javaには一見closureにとても良く似た記法があります。
無名クラスを使って、
    class MyClass {
       void method1(final int x) {
	 ActionListener a = new ActionListener() {
	  public void actionPerformed(ActionEvent e) {
	    ... xへの参照 ...
	  };
	 ...
       }
    }
みたいに書けたりしますが、ここでactionPerformedの中でxを変更することは
出来ません。(actionPerformedの中で参照するmethod1の変数は、finalでない
とコンパイル時にエラーになってしまいます。)

VM仕様の互換性を保ったまま変更可能にするのが実装上困難だったのでしょう
けど、これはプログラマにとって非常に理解しにくい制限です。

===========

Javaの経験からの私の個人的な意見としては、同じような「変数」に見えるの
に変更できる場合やできない場合があるのは統一が取れていなくて分かりにく
いと思います。(プログラマが望んで「変更不可」と指定したのなら別ですが。)

もし「closed variableは変更不可」とするのなら、closed variableの参照の
仕方(構文)を、普通の変数の参照とは全く異なるものにする、なんてのはどう
でしょう?

				前田敦司

--
ML: langsmith quickml.atdot.net
使い方: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]

        76 2004-07-13 12:42 [mogami brain.riken.g] 変更可能なclosure変数、対、static変数   
        77 2004-07-13 13:42 ┣[nobsun sampou.org   ]                                       
->      78 2004-07-13 15:07 ┣[maeda-langsmith atus]                                       
        80 2004-07-13 19:58 ┃┣[mogami brain.riken.g] Re: 変更可能なclosure変数、対、sta  
        81 2004-07-14 01:52 ┃┗[shugo ruby-lang.org ] 強い型の言語とクロージャ            
        84 2004-07-14 15:02 ┃ ┣[takuo aya.or.jp     ]                                   
        86 2004-07-14 23:32 ┃ ┃┗[shugo ruby-lang.org ]                                 
        85 2004-07-14 20:52 ┃ ┗[randy mvd.biglobe.ne]                                   
        87 2004-07-14 23:59 ┃  ┗[shugo ruby-lang.org ]                                 
        88 2004-07-15 00:04 ┃   ┣[shugo ruby-lang.org ]                               
        89 2004-07-15 01:50 ┃   ┗[nobsun sampou.org   ]                               
        90 2004-07-15 11:04 ┃    ┗[shugo ruby-lang.org ]                             
        79 2004-07-13 14:43 ┗[matz ruby-lang.org  ]