首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何避免emacs宏中急迫的宏扩展失败?

如何避免emacs宏中急迫的宏扩展失败?
EN

Stack Overflow用户
提问于 2014-08-02 17:50:34
回答 2查看 4K关注 0票数 3

我定义了这个宏:

代码语言:javascript
运行
复制
(defmacro with-current-directory (directory &rest body)
  "Set the working directory temporarily set to DIRECTORY and run BODY.
DIRECTORY is expanded"
  `(let ((default-directory
          ,(file-name-as-directory
            (expand-file-name (eval directory)))))
     ,@body))

在emacs打开时加载的一些lisp函数中使用。我总是收到这样的警告:

代码语言:javascript
运行
复制
Eager macro-expansion failure: (void-variable repo-dir)
Eager macro-expansion failure: (wrong-type-argument stringp nil)

我理解这是因为这些变量没有在加载时定义,而emacs正在尝试对它们进行评估。我的问题是,我如何避免收到这些警告。是否有一种方法来定义宏,这样就不会发生这种情况?我不知道如何使用变量的值,而不是变量本身的符号。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-02 17:59:11

如下所示:

代码语言:javascript
运行
复制
`(let ((default-directory
        (file-name-as-directory (expand-file-name ,directory))))

由于directory不是值,而是计算值的lisp表达式,所以需要(使用逗号运算符)将表达式插入宏的展开中。如果在调用file-name-as-directory之前放置逗号,则必须能够在宏展开时仅根据表达式的标记计算目录,如果directory引用变量名,则不能这样做。

票数 5
EN

Stack Overflow用户

发布于 2014-08-02 18:10:50

看来有人比我早。看另一个答案。

您不应该在展开时评估文件名展开。此外,eval调用不应该在那里。在宏展开过程中,惟一应该发生的事情是将目录的值放置在返回的表达式中。删除eval并将您的逗号放在目录前面。

很高兴知道,无论什么时候你在使用eval,你很可能做错了什么

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25097816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档