如何以可移植方式编程判断符号是否为Symbol Macro?
可移植判断符号是否为Symbol Macro的方法
首先看测试示例:定义符号宏后,常规的macro-function和fboundp无法识别它——因为符号宏不属于函数宏范畴,也不会被标记为可调用:
CL-USER> (define-symbol-macro some-macro some) SOME-MACRO CL-USER> (macro-function 'some-macro) NIL CL-USER> (fboundp 'some-macro) NIL
SBCL专属查询方式
在SBCL中,可以通过内部函数sb-impl::info查询变量类型,判断是否为符号宏:
CL-USER> (sb-impl::info :variable :kind 'some-macro) :MACRO T
可移植实现方案
如果需要跨Common Lisp实现的可移植方案,首先可以借助trivial-cltl2库提供的兼容接口,而最简的原生可移植方法是直接使用macroexpand-1:当符号是符号宏时,macroexpand-1会返回其展开形式和T(表示发生了展开):
(macroexpand-1 'some-macro) => (some T)
另外,也可以基于variable-information实现一个symbol-macro-p函数:
(defun symbol-macro-p (symbol) (eq (nth 3 (variable-information symbol)) :symbol-macro))
内容的提问来源于stack exchange,提问作者myname
相关产品推荐
相关产品推荐

