マクロの書き換え

自分の処理系では letrec-syntax が動くのはだいぶ先であるという事情により、Gauche のソースから持ってきた letrec-syntax なマクロをグローバルな伝統的マクロに書き換えるという作業をした。
macroexpand でカンニングしつつも結構時間かかった。

    (letrec-syntax ((sum-items
                     (syntax-rules (*)
                       ((_ cnt) cnt)
                       ((_ cnt (* item1) item2 ...)
                        (let1 s1 (rec-list item1 cnt)
                          (if (>= s1 limit) limit
                              (sum-items s1 item2 ...))))
                       ((_ cnt item1 item2 ...)
                        (let1 s1 (rec item1 cnt)
                          (if (>= s1 limit) limit
                              (sum-items s1 item2 ...))))))
                    )
=>
(define-macro (sum-items cnt . items)
  (if (null? items)
      cnt
      (let1 target-list? (and (pair? (car items)) (eq? (caar items) '*))
        `(let1 s1 (,(if target-list? 'rec-list 'rec) ,(if target-list? (cadar items) (car items)) ,cnt)
           (if (>= s1 limit) limit
               (sum-items s1 ,@(cdr items)))))))