(define-syntax match
(syntax-rules (else guard)
((_ v) (error 'match "~s" v))
((_ v (else e ...)) (begin e ...))
((_ v (pat (guard g ...) e ...) cs ...)
(let ((fk (lambda () (match v cs ...))))
(ppat v pat (if (and g ...) (begin e ...) (fk)) (fk))))
((_ v (pat e ...) cs ...)
(let ((fk (lambda () (match v cs ...))))
(ppat v pat (begin e ...) (fk))))))
(define-syntax ppat
(syntax-rules (unquote)
((_ v () kt kf) (if (null? v) kt kf))
((_ v (unquote var) kt kf) (let ((var v)) kt))
((_ v (x . y) kt kf)
(if (pair? v)
(let ((vx (car v)) (vy (cdr v)))
(ppat vx x (ppat vy y kt kf) kf))
kf))
((_ v lit kt kf) (if (eq? v (quote lit)) kt kf))))
你说的应该是那个pmatch吧。以上就是它的实现。这个实现来源于oleg同志。就20行。我觉得很容易看懂,就不解释了。
我实在搞不懂把pmatch和cond这两个字眼还能搞混淆。而且我还怀疑你在钓鱼。我再多说一句,cond在scheme里也是用宏实现的。
我实在搞不懂你怎么能问出这样的问题,因为这个代码几乎在知道Scheme的人里人手一份。
如果你不是在钓鱼,你几乎对于LISP一无所知,LISP材料多了去了,可供你在实现解释器上参考的有LISP 1.5手册,Lisp in Small Pieces,Essentials of Programming Languages,Structure and Interpretation of Computer Programs,... ...