これを実行させてみました
実行したときの様子。VERSION:0.04て出ますが、0.05の誤りですorz
VERSION:0.04 OBJECTSTACK:999 CSTACK:999 HEAP:5000 (load "evaltest.scm") <unspecified> superClass <closure ((x) (define (self) self) (define (+! y) (set! x (+ x y))) self)> theClass <closure ((y) (eval/e (superclass (+ y 10)) (let ((super self)) (define (self) self) (define x 99) (define (display-status) (display (eval/e self x)) (display "+") (display (eval/e super x)) (display "=") (display (+ (eval/e self x) (eval/e super x))) (newline)) (define (test-method) (display "start") (newline) (display-status) ((eval/e super +!) 1) (set! x (+ x 2)) (display "end") (newline) (display-status)) self)))> (define o (theClass 1)) <unspecified> o <closure (() self)> o.x 99 o.display-status <closure (() (display (eval/e self x)) (display "+") (display (eval/e super x)) (display "=") (display (+ (eval/e self x) (eval/e super x))) (newline))> o.test-method <closure (() (display "start") (newline) (display-status) ((eval/e super +!) 1) (set! x (+ x 2)) (display "end") (newline) (display-status))> o.super <closure (() self)> o.super.x 11 o.super.+! <closure ((y) (set! x (+ x y)))> o.self.x 99 o.self.super.x 11 (o.display-status) 99+11=110 <unspecified> (o.test-method) start 99+11=110 end 101+12=113 <unspecified> (o.display-status) 101+12=113 <unspecified>
なんとなく、思ったとおりに動きました。
オブジェクト指向言語と違うのは、インスタンスを作ってしまったあとメソッドの追加や修正したいとき、オブジェクト指向言語ではクラスにメソッド追加してやればいいんですが、このやり方だと、すべてのインスタンスにメソッドを定義してやらなければならないことかなぁ。
まあその、自己満足の実装ですから、とりあえず良しとしました。