マクロの書き換え
自分の処理系では 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)))))))