[Anthy-dev 578] Re: uimのキーバインド定義を簡単に

Back to archive index

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)))
                                ^^^^^^^^^^^^^^^^^^^^^^^^^ ここは処理系に依る 
と作ることになります。
-- 



Anthy-dev メーリングリストの案内
Back to archive index