gpt4 book ai didi

emacs - 根据不同的条件,将不同的代码片段写入编译后的 (.elc) 文件

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

我想有条件地将不同的代码片段写入我的 elisp 文件 (.elc) 的编译版本,我可以使用函数定义来做到这一点:

(defalias 'my-test
(eval-when-compile
(if nil
(lambda ()
(message "True"))
(lambda ()
(message "False")))))

使用上面的代码,我可以将不同的匿名函数分配给 my-test基于不同的条件,结果将写入编译的 .elc文件。但我想写的是文件范围中的函数调用。像这样:

(eval-when-compile
(if nil
(add-to-list 'auto-mode-alist '("\\.gitconfig\\'" . A-mode))
(add-to-list 'auto-mode-alist '("\\.gitconfig\\'" . B-mode))))

;; or using `when' to either write a call or do nothing:
(eval-when-compile
(when (not (eq (user-uid) 0)) ; if uid != 0
(dangerous-call)))

代码在编译时进行评估,评估结果仅在编译过程中可用,之后什么都不会进入 .elc , 因为我没有将它分配给任何东西,但是我怎么能写出 if字节编译结果呢?控制(这是对 add-to-list 函数的调用)到已编译的 .elc文件?在这种情况下,我想要 (add-to-list 'auto-mode-alist '("\\.gitconfig\\'" . B-mode))写入 .elc文件。

最佳答案

我认为这个问题的答案是宏:如果你编写一个扩展为你想要的代码的宏,然后简单地在顶层调用宏,那么宏的扩展将在编译后的代码中结束文件。

所以:

(defmacro foo ()
(if <compile-time-condition>
`(setq ...)
`(setq ...)))

(foo)

警告:您只能根据您在编译时知道的事情进行条件化:您在 UID 上调度的示例可能无法达到您的预期。

关于emacs - 根据不同的条件,将不同的代码片段写入编译后的 (.elc) 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35392211/

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