如标题所示,如何(以编程方式)以可移植的方式(如果可能)检查符号是否代表符号宏?
CL-USER> (define-symbol-macro some-macro some)
SOME-MACRO
CL-USER> (macro-function 'some-macro)
NIL
CL-USER> (fboundp 'some-macro)
NIL
SBCL 有 sb-impl::info:
CL-USER> (describe 'sb-impl::info)
SB-INT:INFO
[symbol]
INFO names a compiled function:
Lambda-list: (CATEGORY KIND NAME)
Declared type: (FUNCTION (T T T) (VALUES T T &OPTIONAL))
Source file: SYS:SRC;COMPILER;GLOBALDB.LISP
INFO has a compiler-macro:
Source file: SYS:SRC;COMPILER;EARLY-GLOBALDB.LISP
(SETF INFO) names a compiled function:
Lambda-list: (NEW-VALUE CATEGORY KIND NAME)
Declared type: (FUNCTION (T T T T) (VALUES T &OPTIONAL))
Source file: SYS:SRC;COMPILER;GLOBALDB.LISP
(SETF INFO) has a compiler-macro:
Source file: SYS:SRC;COMPILER;EARLY-GLOBALDB.LISP
似乎有效:
CL-USER> (sb-impl::info :variable :kind 'some-macro)
:MACRO
T
这就是他们在“描述”功能的源代码中使用的内容(我是通过查看那里找到的)。
在此之前我正在查看 clhs 但没有找到任何东西。我错过了还是没有标准方法?是否有一些可移植/“琐碎”的库可以做到这一点?
VARIABLE-INFORMATION
¹ 位于 CLtL2 中,但不是 Common Lisp 标准,至少某些 CL 实现支持该函数,可用于判断符号是否具有符号宏。
在 SBCL 中,可通过以下方式访问:
CL-USER> (require :sb-cltl2)
("SB-CLTL2")
CL-USER> (sb-cltl2:variable-information 'some-macro)
:SYMBOL-MACRO
NIL
NIL
Clozure 将其放在
CCL
包中:
CL-USER> (ccl:variable-information 'some-macro)
:SYMBOL-MACRO
NIL
NIL
Allegro 在其文档中列出了它,但我没有要测试的副本。
1:在 Rainer 的回答中找到了这个函数,关于另一个问题,即当我寻找重复项时如何判断变量是否为特殊变量。