Macros 宏模式不匹配

Macros 宏模式不匹配,macros,scheme,pattern-matching,Macros,Scheme,Pattern Matching,因此,我有一个用于制作对象的宏,它的用法如下: (define ob (class (a 10) (b 20) (set-a! (lambda (x) (set! a x))) (set-b! (lambda (x) (set! b x))) (foo (lambda (x) (* (+ a b) (- a b)))))) (ob 'a) -> 10 (ob 'b) -> 20 (ob 's

因此,我有一个用于制作对象的宏,它的用法如下:

(define ob 
  (class (a 10) (b 20)
         (set-a! (lambda (x) (set! a x)))
         (set-b! (lambda (x) (set! b x)))
         (foo (lambda (x)
                (* (+ a b) (- a b))))))

(ob 'a) -> 10
(ob 'b) -> 20
(ob 'set-a! 50)
(ob 'a) -> 50
(ob 'foo) -> 2100
我添加了另一种模式,即拥有公共和私人成员

(define ob
  (class private
         (a 10) (b 20)
         public
         (get-a (lambda (x) a))
         (set-a! (lambda (x) (set! a x)))))
这是可行的,但出于某种原因,它不符合这种模式:

(define ob2
  (class private
         (a 10) (b 20) (c '())
         public
         (get-a (lambda (x) a))
         (get-b (lambda (x) b))
         (set-a! (lambda (x) (set! a x)))
         (set-b! (lambda (x) (set! b x)))
         (push-c! (lambda (x)
                    (set! c (cons x c))))
         (pop-c! (lambda (x)
                   (if (not (eq? c '()))
                       (set! c (cdr c))
                       (error "stack empty!"))))))

试图使用ob2的错误消息在源代码中

据我所知,第一个示例也不应该工作,事实上,我无法让它工作。我认为你不能在同一水平面上使用两个椭圆。因此,更容易定义如下内容

(define-syntax class
  (syntax-rules (public private)
    ((class (public (?var ?val) ...) (private  (?var1 ?val1) ...))
     (list  (list ?var ?val) ... (list ?var1 ?val1) ...))))
但是,如果必须在同一语法级别上执行所有操作,则可以通过递归应用宏来执行,方法如下:

(define-syntax testclass
  (syntax-rules (public private)
    ((testclass public (var val) . rest)
     (testclass ((var val)) public . rest))
    ((testclass ((var val) ...) public (var1 val1) . rest)
     (testclass ((var val) ... (var1 val1)) public . rest))
    ((testclass lst public private . rest)
     (list (quote lst) (quote rest)))))

为了使其更加健壮,您必须为空的公共和私有表达式添加规则。

您使用的是什么方案实现?我用的是鸡肉,正在IRC上解决这个问题,我们用两个省略号肯定没有问题,其他人也能用第一个例子。我和实现设计师谈过,他们说它在语法上是正确的,而且它在R5RS中也定义了行为省略的用法没有定义R5RS/R7RS。参见第4.3.2节(巧合的是,R5和R7的章节号相同)。如果您想编写可移植代码,那么最好将省略号分成两种模式。@Anandamide实现者对这个问题有什么要说的吗?据我所见,这两个例子在结构上是相同的。我能看到的唯一(可能相关的)区别是,两个省略号匹配的列表数量在示例一中相同,而在示例2中不同。