一千萬個為什麽

搜索

如何在emacs 24.3中禁用eager load-time宏擴展?

是否可以在emacs 24.3.1中禁用預先加載時宏擴展?出於調試目的,我想在運行時每次調用時擴展宏。

獲取延遲宏評估的一種工作非標準方法是包含一個變量dummyVar(在加載時未定義,稍後在運行時定義),然後是一個錯誤消息,如“Eager宏擴展失敗:(void-variable dummyVar) “在加載時發生,宏在運行時擴展。我沒有找到lisp命令來獲取此行為。

最佳答案

這是你想要的東西,然而,我懷疑這是你真正需要的。這實際上沒有幫助調試,如果有的話,它使調試更復雜:

(defmacro lazy-macro (name args &rest body)
  (declare (indent defun))
  `(defun ,name ,args
     (eval '(progn ,@body))))

(lazy-macro lazy-test (foo)
  (message "%s" foo))

(lazy-test (list 1 2))
;; "(1 2)"

請註意,'(progn,@ body)在運行時只是一個列表,因此,如果您願意,可以在編譯函數後檢查/更改它。

轉載註明原文: 如何在emacs 24.3中禁用eager load-time宏擴展?