[英]when macro control flow in elisp
when
从subr.el获取宏的代码
(defmacro when (cond &rest body)
(declare (indent 1) (debug t))
(list 'if cond (cons 'progn body)))
在这里,最后一种形式很复杂,
(list 'if cond (cons 'progn body))
构造列表时,它已经对cond
和body
形式进行了评估吗? 为什么程序员在一个地方使用list
,而在另一个地方使用cons
? 他们都不都采用多种形式并列出清单吗?
(list 'if cond (.......))
(cons 'progn body)
宏对代码进行操作。 因此,当宏when
展开时(即,调用了宏展开功能),符号cond
和body
绑定到您编写的表达式(符号或列表)上。
例如,如果您写
(when (plusp 1)
(print 'yes)
(+ 1 2 3))
使用绑定到以下参数的宏扩展调用:
cond = (plusp 1)
body = ((print 'yes) (+ 1 2 3))
因此表达
(list 'if cond (cons 'progn body))
体现为
(let ((cond '(plusp 1))
(body '((print 'yes) (+ 1 2 3))))
(list 'if cond (cons 'progn body)))
==> (if (plusp 1) (progn (print (quote yes)) (+ 1 2 3)))
这正是您想要的。
list
和cons
之间的区别:
(list 'progn '((foo) (bar)))
;;=> (progn ((foo) (bar)))
(cons 'progn '((foo) (bar)))
;;=> (progn (foo) (bar))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.