syntax-case の unsyntax-splicing
unsyntax-splicing の良さが分かった。datum であるリストを syntax object にして括弧をはぎ取りたいときは、確かにある。以下の例では #,@#'f* の部分で使っている。
(define-syntax define-c-struct (lambda (x) (syntax-case x (struct) [(_ name (struct field-spec* ...)) (let-values ([(struct-size field*) (process-c-struct-field* (syntax->datum #'(field-spec* ...)))]) (with-syntax ([struct-size struct-size] [size-getter (gen-id 'size-of #'name)] [constructor (gen-id 'make #'name)] [f* (datum->syntax #'name field*)]) #`(begin (define-c-struct-accessors #,@#'f*) (define size-getter (lambda () struct-size)) (define constructor (lambda () (make-bytevector struct-size))))])))))
それにしてもマクロは for-each に相当する処理を再帰的に書かないといけないのが、慣れるまで大変だな。
ヘルパーマクロでうまく for-each のように抽象化できそうな気もする。