我不知道lisp宏如何构建它的扩展?什么是确切的步骤?

use*_*065 3 lisp emacs macros expansion

我试着写一个宏并执行如下.但它未能执行.

(defmacro times_two (var) (* 2 var))
(times_two '(+ 1 2))
Run Code Online (Sandbox Code Playgroud)

在我的想象中,我认为扩张将是(*2(+ 1 2)).并且在执行之后,结果将是6.但是失败了.

我不知道为什么.我阅读了Emacs lisp手册,但我仍然无法理解它们.我想知道在构建扩展时究竟是什么步骤.口译员做了什么?

Nat*_*C-K 7

当我在Emacs中评估这些表单时,我在评估第二个表时收到此错误消息:

Debugger entered--Lisp error: (wrong-type-argument number-or-marker-p (quote (+ 1 2)))
  *(2 (quote (+ 1 2)))
  (lambda (var) (* 2 var))((quote (+ 1 2)))
  (times_two (quote (+ 1 2)))
  eval((times_two (quote (+ 1 2))))
  eval-last-sexp-1(nil)
  eval-last-sexp(nil)
  call-interactively(eval-last-sexp nil nil)
Run Code Online (Sandbox Code Playgroud)

这向您展示了如何扩展宏,它应该告诉您出了什么问题.(最终扩展位于顶部.)

引用的表达式'(+ 1 2)传递给times_two宏,但引用的列表不是*函数的有效参数.

你真正想要的是:

(defmacro times_two (var) `(* 2 ,var))
(times_two (+ 1 2))
Run Code Online (Sandbox Code Playgroud)

请记住,通常,宏的结果将是新的Lisp代码,而不是最终值.编写宏的目的是构建能够为您提供所需结果的表单.因此,大多数时候你的宏最终会使用quasiquote(`)语法.