【发布时间】:2015-10-23 04:04:02
【问题描述】:
我正在尝试编写一个ELisp 宏来根据一些常见数据生成多个函数。例如,当我想计算 fn 名称时,我会写一些类似的东西(我暂时忽略了卫生,我将符号文字传递到宏中,因此评估无关紧要):
(cl-defmacro def-fns (sym)
"SYM."
(let ((s1 (make-symbol (concat (symbol-name sym) "-1")))
(s2 (make-symbol (concat (symbol-name sym) "-2"))))
`(progn (defun ,s1 () (+ 1 2 3))
(defun ,s2 () "six"))))
我希望在调用时生成 2 个 fns,称为 foo-1 和 foo-2。
然后我应该能够像这样调用宏和 fns:
(def-fns foo)
(foo-1)
;; => 6
(foo-2)
;; -> "six
即使是 Emacs 中 (def-fns foo) 的宏扩展也表明应该是这种情况:
(progn
(defun foo-1 nil (+ 1 2 3))
(defun foo-2 nil "six"))
但是,当我评估def-fns 定义并调用它时,它不会 生成这些函数。为什么会这样?这种技术适用于 Common Lisp 和 Clojure(它们具有非常相似的宏系统),那么为什么不在 ELisp 中呢?
【问题讨论】: