繁体   English   中英

当宏控制流在elisp中时

[英]when macro control flow in elisp

whensubr.el获取宏的代码

(defmacro when (cond &rest body)
  (declare (indent 1) (debug t))
  (list 'if cond (cons 'progn body)))

在这里,最后一种形式很复杂,

(list 'if cond (cons 'progn body))

构造列表时,它已经对condbody形式进行了评估吗? 为什么程序员在一个地方使用list ,而在另一个地方使用cons 他们都不都采用多种形式并列出清单吗?

(list 'if cond (.......))
(cons 'progn body)

宏对代码进行操作。 因此,当宏when展开时(即,调用了宏展开功能),符号condbody绑定到您编写的表达式(符号或列表)上。

例如,如果您写

(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)))

这正是您想要的。

最后, listcons完全不同,请阅读其文档( 清单RET &c)和高级手册

listcons之间的区别:

(list 'progn '((foo) (bar)))
;;=> (progn ((foo) (bar)))

(cons 'progn '((foo) (bar)))
;;=> (progn (foo) (bar)) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM