NIIBE Yutaka
gniib****@m17n*****
2004年 2月 20日 (金) 18:39:22 JST
TOKUNAGA Hiroyuki wrote: > マクロを使わずに呼び出した側の環境(もしくはトップレベルの環境)に変数 > を束縛する方法ってあるんでしょうか? eval を使うというのが答えです。たぶん。 僕も Emacs Lisp から Lisp にはいったので, このまわりで同様なことについ てこれまで悩んでました。先日, 川合さんに聞いてやっぱりそうかと納得した ところです。 「マクロでできるはず」と考えるのですが, マクロでも(処理系によっては)難 しいです。Gauche, Guile でやってみたけど, 僕にはできませんでした。 例として単純化してみましょう。例えば, プログラムの断片に (set! a 1) (set! b 1) (set! c 1) (set! d 1) とあったら, まとめようとかんがえて(Emacs Lisp 流儀では) (for-each l '(a b c d) (my-set-defined-as-macro (car l) 1)) としてしまう。それでマクロで展開して `(set! ,symbol ,expr) とできない かと思いますよね。普通。ここで僕はつまずきました。できませんでした。 本質的にこれはその環境で eval せねばなりません。だからマクロではなくて, 上記の例では, 関数として, (define (my-set symbol expr) (eval `(set! ,symbol ,expr) (interaction-environment))) ^^^^^^^^^^^^^^^^^^^^^^^^^ ここは処理系に依る と作ることになります。 --