[Gauche-devel-jp] syntax-rules の <...>(tridot) と 変換形式

Back to archive index

Shoji Kuzukami kuzuk****@manba*****
2004年 8月 24日 (火) 15:15:02 JST


こんにちは,葛上です.

現在,私用で任意ベクトルN次元のmap,fold,for-eachなどを作っているのですが,
これらの根底のloopとしてsyntax-rulesでマクロを作って,全部がそれを使うという構成をやっています.

コード的には完成したのですが,
その際にsyntax-rulesの出力の仕様(?)で少しまずい思いをしたので,
次回からのコード書きに繋げたいと思って質問させていただきます.

以下のようなコード
(define-syntax call-with-binding (syntax-rules ()
	((_ "sec" lam (%tmp-name a) ...)
		(let
				((%tmp-name a) ...)
			(lam %tmp-name ...)))
	((_ lam a ...)
		(call-with-binding "sec" (%t a) ...))))
があって,

(call-with-binding + (+ 1 2 ) ( + 2  3))
のようなことをやった場合,
goshでは, %tによって生成される識別子オブジェクトが全て同じオブジェクトになります.
しかし,上のようなコードの場合,
aごとに別の識別子オブジェクトに%tを割り付けたいという意図を感じると思います.
つまり,ちゃんとこのコードを動かそうと思えば,いちいちsyntax-rulesの中で,
aごとにループして新しいidentifierを生成する必要があるようです.
こんなことをやっていたら,syntax-rulesのおいしさ激減だと思うのですがどうでしょうか.

このようなコードを書いて少し自身でも混乱してしまい,R5RSに立ちかえったのですが,
R5RSには,「はじめて出てきたやつには,あらたなidentifierをふる」とあるだけで
<...>(tridot)の内部のことは書いておらず,
むしろtridotのなかにそういったものがあるのは不自然だ(?)という書き方を感じました.
つまり,規定しない規定したくない何かがあるのだと思います.

もしよろしければ,
このような問題の解決方法に知恵を貸していただけませんでしょうか?

自分なりの解としては,
例えば,
(%t a) ... -> (%t a) ....
と書くことで,
内部のidentifierが新たに生成されるというような書き方があると楽ではないかなと思っております.

よろしくおねがいします.

----
Shouji Kuzukami
kuzuk****@kamad*****



Gauche-devel-jp メーリングリストの案内
Back to archive index