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 のように抽象化できそうな気もする。