一千萬個為什麽

搜索

定義僅存在於一個.el文件中的宏

有沒有辦法在emacs-lisp文件中定義一個宏,以便在讀取和評估文件後,宏在其他任何地方都不可見?

有點像臨時宏超出文件末尾的範圍?

最佳答案

文件結束時,您始終可以取消綁定宏。據我所知,Emacs Lisp不必擔心異步復雜性;執行流程純粹是線性的。因此,您可以這樣做:

(defmacro my-test-macro (secret sauce recipe)
   ;; super secret stuff here
   ;; wouldn't want it to LEAK out
   ;; and get stolen by some other files
   )

;; [...] blabitty blah blah [...]

(fmakunbound 'my-test-macro)

你應該看的另一個解決方案(不那麽hacky)使用 cl-macrolet ,這基本上是宏的 let

(eval-when-compile (require 'cl-lib))
(cl-macrolet ((my-test-macro (secret sauce recipie)
                 ;; super secret stuff here
                 ;; wouldn't want it to LEAK out
                 ;; and get stolen by some other files
                 ))

  ;; [...] blabitty blah blah [...]

  )

毫無疑問,這個解決方案更清晰,盡管你通過添加另一個級別的縮進來支付它。此外,宏是動態綁定的,理論上可以異步運行(盡管Emacs距離多線程還有很長的路要走)。

轉載註明原文: 定義僅存在於一個.el文件中的宏