You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以可移植方式编程判断符号是否为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:20:56