我正在寻找一种可移植的方式来设置数据,然后其他宏可以使用这些数据。所有修改都将在顶层进行。我想出了这个:
(import (scheme base)
(scheme write))
(define-syntax foo-data
(syntax-rules ()
((_ (k ...)) (k ... ()))))
(define-syntax foo-add
(syntax-rules ()
((_ a)
(let-syntax ((k (syntax-rules ...* ()
((_ (old-data ...*))
(define-syntax foo-data
(syntax-rules ...** ()
((_ (k* ...**)) (k* ...** (old-data ...* a)))))))))
(foo-data (k))))))
(define-syntax foo-display
(syntax-rules ()
((_)
(let-syntax ((k (syntax-rules ...* ()
((_ (data ...*))
(begin
(display (list data ...*))
(newline))))))
(foo-data (k))))))
(foo-add 1)
(foo-add 2)
(foo-display)
(foo-add 3)
(foo-display)
这在逻辑上做了我想要的,但它似乎只适用于赤壁方案;gauche 两次都打印空列表,kawa 抛出关于空体的错误。什么地方出了错?这在原则上是否可行?