gpt4 book ai didi

emacs - 不知道lisp宏是怎么构造它的扩展的?具体步骤是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 18:41:37 25 4
gpt4 key购买 nike

我尝试编写一个宏并按如下方式执行它。但未能执行。

(defmacro times_two (var) (* 2 var))
(times_two '(+ 1 2))

在我的想象中,我认为扩展是 (* 2 (+ 1 2))。执行后结果为6,但失败。

我不知道为什么。我阅读了 Emacs lisp 手册,但我仍然无法理解它们。我想知道构建扩展时的确切步骤到底是什么。翻译做了什么?

最佳答案

当我在 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)

这向您展示了它是如何扩展宏的,它应该会告诉您哪里出了问题。 (最后的扩展在顶部。)

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

你真正想要的是:

(defmacro times_two (var) `(* 2 ,var))
(times_two (+ 1 2))

请记住,一般来说,宏的结果将是新的 Lisp 代码,而不是最终值。编写宏的目标是构建能够为您提供所需结果的表单。因此,大多数时候您的宏最终会使用准引号 (`) 语法。

关于emacs - 不知道lisp宏是怎么构造它的扩展的?具体步骤是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12151869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com