05/12/17 01:53:11
>>888
では混乱を無くすために
クロージャ=Schemeのクロージャ(あるいはラムダ式、無名関数)
と定義するよん。他の言語も右に倣えだから意味論はほとんど同じ。
例えばクロージャのある言語ではnewのような特別な構文を
定義することなくオブジェクトの生成を記述できる。
(define new-point
(lambda (x y) ;---メンバ変数に相当、隠蔽される
(lambda (message . args) ;---this、selfに相当
(case message
((getx) x) ;--- getter
((gety) y)
((setx) (set! x (car args)) x) ;--- setter
((sety) (set! y (car args)) y)
(else (error "unknown method " message))))))
実際にやっていることはクロージャを生成するクロージャを
定義しただけ。それでも以下の様にオブジェクトとして扱える。
(define point (new-point 1 2))
;メンバ変数はどうやってもアクセサ経由でしか参照できない
(point 'getx) ;=>1
(point 'gety) ;=>2
(point 'setx 3)
(point 'getx) ;=>3