簡體   English   中英

宏模式不匹配

[英]Macro pattern not 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 '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)))))

為了使其更強大,您將必須為空的公共和私有表達式添加規則。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM