新たな変数名の作成

http://d.hatena.ne.jp/yagiey/20100305/1267761841
手元にプログラミングgaucheがないので不確かなことを言っているかもしませんが、新たな変数名の作成というのは、渡された引数をマクロの中で変換して創り出した新しいsymbolを利用した手続きや変数の定義を行うということだと思いますよ。
表にすると

  r5rsのマクロ 伝統的なマクロ
適用時の形 ( x y) ( x y)
生成できる変数名 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

*1:r6rsだと変わってくるけれど