【问题标题】:when macro control flow in elisp当 elisp 中的宏控制流程
【发布时间】:2015-01-29 23:23:57
【问题描述】:

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

在构造列表时,是否已经完成了condbody 表单的评估? 为什么程序员在一处使用list 而在另一处使用cons?他们不是都采取多种形式并列出一个清单吗?

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

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

    宏对代码进行操作。因此,当宏 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)))
    

    这正是你想要的。

    最后,list and cons 完全不同,请阅读他们的文档(C-h f list RET&c)和the fine manual

    【讨论】:

      【解决方案2】:

      listcons 之间的区别:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        • 2010-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多