作者:天和网-嫣然 | 来源:互联网 | 2023-05-24 13:53
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)
sds..
5
宏对代码进行操作.因此,当宏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
完全不同,请阅读他们的文档(C-h f list RET&c)和精细手册.
1> sds..:
宏对代码进行操作.因此,当宏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
完全不同,请阅读他们的文档(C-h f list RET&c)和精细手册.