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

转载于:https://my.oschina.net/firebroo/blog/303805

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值