首页 > 解决方案 > Scheme R7RS 在宏展开时设置和使用状态的便携方式?

问题描述

我正在寻找一种可移植的方式来设置数据,然后其他宏可以使用这些数据。所有修改都将在顶层进行。我想出了这个:

(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 抛出关于空体的错误。什么地方出了错?这在原则上是否可行?

标签: schemer7rs

解决方案


推荐阅读