Shiro Kawai
shiro****@lava*****
2003年 12月 12日 (金) 12:17:51 JST
From: Shoji Kuzukami <kuzuk****@manba*****> Subject: [Gauche-devel-jp] Re: lib/slib.scmの(home-vicinity) Date: Fri, 12 Dec 2003 11:59:33 +0900 > 不具合は出ていませんが, > 単にmacroexpandをしたときにシンボルでなければ,デバッグが難しくなると思うからです. > 展開結果の同一性を確認するのが難しいからです. > ;すくなくとも,macroのデバッガは,処理系依存のものになってしまいます. > ;両方ともできるのが正解だと思います. なるほど。確かにポータブルに同一性を確認するのは難しいですね。 eqv? で identifierが比べられるようにとかしておくのがいいのだろうか。 今思い出したのですが、free variableは特にsymbolにできない理由と いうのがありました。 Gaucheでは、syntax-caseはモジュールを含めた環境でhygenicに動作します。 つまり、こんなコードがあった場合: (define-module foo (define (foo-proc ...)) (define-syntax foo-macro (syntax-case () ((foo-macro x) (foo-proc x)))) (export foo-macro)) (define-module bar (import foo) (define (foo-proc ...)) (foo-macro ...)) barでのfoo-macroの展開結果に含まれるfoo-procは、 マクロ使用環境(bar)でのfoo-procではなく、 マクロ定義環境(foo)でのfoo-procを参照します。 マクロ展開結果が補助手続きを必要とする場合に、補助手続き自体を 外に見せる必要がないですし、hygenicという点からもこのほうが 自然だと思うのですが、free variableをシンボルにしてしまうと これが出来ないんですよね… --shiro