码迷,mamicode.com
首页 > 其他好文 > 详细

scheme macro vs common lisp macro

时间:2014-08-18 16:38:12      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:使用   ar   工作   amp   ad   ef   python   on   

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是如何处理的,根本没有必要先包裹然后解构啊。

scheme macro vs common lisp macro,布布扣,bubuko.com

scheme macro vs common lisp macro

标签:使用   ar   工作   amp   ad   ef   python   on   

原文地址:http://my.oschina.net/firebroo/blog/303805

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!