首页 > 代码库 > scheme macro vs common lisp macro
scheme macro vs common lisp macro
common lisp的let宏定义如下
(defmacro our-left (binds &body body) `((lambda ,(mapcar #‘(lambda (x) (if (consp x) (car x) x)) binds) ,@body) ,@(mapcar #‘(lambda (x) (if (consp x) (cadr x) nil)) binds))) ;;;;;;;;;;;;;;;;;;;;;test;;;; (our-left ((x 1) (y 2)) (+ x y)) 展开之后变成 =>((lambda (x y) (+ x y) 1 2) 这里我们不难看出其实let不过是lambda的语法糖:)
scheme的let宏定义如下
(defien-syntax let (syntax-rules () ((_ ((x v) ...) e1 e2 ...) ((lambda (x ...) e1 e2 ...) v ...)))) scheme的比上面的那个优雅,直观吧,我们能不费力气的看出这个let内部是如何工作的。
scheme的let*宏如下
(define-syntax my-let* (syntax-rules () ((_ ((p v)) b ...) (let ((p v)) b ...)) ((_ ((p1 v1) (p2 v2) ...) b ...) (let ((p1 v1)) (my-let* ((p2 v2) ...) b ...))))) 其实scheme的宏是一种模式匹配,所以事先一定要把所有的情况的考虑清楚。
那一堆的使用@来解构真的是没有必要的,看看shceme是如何处理的,根本没有必要先包裹然后解构啊。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。