とりあえず、組み込みのprint関数の呼び出し前に与えられた引数をエラーポートに出力したいとする。ここではprintにしたけど、別に何でもいい。
そうすると、こう書ける。
(import (rnrs) (clos user)) (define org:print print) (define-method print objs (apply org:print objs)) (define-method print ((num <integer>) . args) (format #t "~b" num) (apply print args)) (define-method print :before args (display args (current-error-port)) (newline (current-error-port))) (print 1 2 3) #| (1 2 3) ;; これらがエラーポートに出力された引数 (2 3) ;; printが呼ばれた回数だけ:beforeが呼ばれている (3) () ;; もちろん'()もある 11011 |#ついでに、先頭の引数が数字だったら2進数で出力するようにしてある。意味はない。オリジナルの名前を変えているのはqualifierがどのパターンでも適用されるようにするため。単にオリジナルと同じ引数を取る総称関数がほしいだけともいう。
なにが嬉しいか?Aspect指向的なことが簡単に出来そう。(多分前にも書いたな)。とりあえずこれを使って何か出来ないか考えたい。問題は、通常の呼び出しに比べて遅いことか・・・
No comments:
Post a Comment