新たな変数名の作成
http://d.hatena.ne.jp/yagiey/20100305/1267761841
手元にプログラミングgaucheがないので不確かなことを言っているかもしませんが、新たな変数名の作成というのは、渡された引数をマクロの中で変換して創り出した新しいsymbolを利用した手続きや変数の定義を行うということだと思いますよ。
表にすると
r5rsのマクロ | 伝統的なマクロ | |
適用時の形 | ( |
( |
生成できる変数名 | x,yのみ | x,y を組み合わせた何か(e.g. make-x make-y) |
例えば、その例として、
"構造体定義の際にスロットアクセス手続きを自動で定義したい"というのは、
- 構造体を定義するマクロdefine-structを作りたい
- このマクロを利用して作成した構造体へのaccessorを自動で定義したい。
というような感じです。コードは汚いですが以下のようになります。
code
(use srfi-1) ;iota (define-macro (define-struct name . args) (define (mk-symbol . args) (string->symbol (string-join (map x->string args) ""))) `(begin (define (,(mk-symbol "make-" name) ,@args) (vector ,@args)) (begin ,@(map (lambda (arg i) (let1 accessor (mk-symbol name "-" arg) `(begin (define (,accessor ,arg) (vector-ref ,arg ,i)) (set! (setter ,accessor) (cut vector-set! <> ,i <>))))) args (iota (length args)))))) (define-struct point x y z) ;;pointというsymbolを渡した時に ;;make-point, point-x, point-z, point-yという新しい手続き(変数名)が生成される (define p (make-point 10 20 30)) (point-x p) ; => 10 (point-y p) ; => 20 (point-z p) ; => 30 (set! (point-x p) 100) (point-x p) ; => 100
このようにpoint,x,y,zからmake-pointやpoint-xという新しい束縛を作るということはr5rsのマクロではできません。*1