【发布时间】:2019-12-15 16:51:04
【问题描述】:
我最近在reddit 上问过这个问题,但我想也许我会在这里得到更好的答案。
我编写的宏通常采用符号或符号列表,有时这些符号表示变量或函数。在这些情况下,我很想编写宏,以便可以引用或引用它们的参数。这是一个具体的例子:
在 emacs lisp 中,函数 add-hook 将 HOOK-FN 添加到名为 HOOK 的列表中。
(add-hook 'hook #'hook-fn)
通常你想向 HOOK 添加几个项目或者你希望 HOOK-FN 到几个 hooks,但是 add-hook 一次只接受一个 hook 或一个 hook-fn。所以,我为此做了一个宏,叫做 add-hook!可以接受多个参数。
(add-hook! hook-name (fn1 fn2 fn3))
;; or
(add-hook! (hook-name1 hook-name2) hook-fn)
我倾向于允许对宏的参数进行引用或尖锐引用。就像它们在函数调用中一样。
(add-hook! 'hook-name #'fn)
为此,我会使用这样的函数来去除每个参数的引号。
(defun unquote (form)
"Unquote a form if it is quoted, otherwise return form."
(if (member (car-safe it) '(quote function))
(cadr form)
form))
我之所以这样做是因为引用和加引号 (1) 可以清楚地表明我是指函数还是符号,并且 (2) 会触发我的自动完成功能,这有助于我更快地键入函数或符号。
但是,我的印象是这不是 lisp 中的约定。为什么?是否有充分的理由不应该在宏中允许引用参数?
【问题讨论】:
-
我认为一个词的答案是“品味”。