Lisp包导入:如何继承packa全部符号并导入packb非冲突符号
在Common Lisp中处理包符号冲突的导入方案
要实现继承packa全部符号,仅导入packb中与packa无交集的导出符号,无需手动逐个编写:import-from,可以通过遍历packb的外部符号自动筛选导入,具体实现如下:
自动筛选导入的代码示例
首先创建新包并继承packa,之后在包内执行符号筛选导入:
(defpackage :new-pack (:use :cl :packa) (:export)) (in-package :new-pack) ;; 遍历packb的所有导出符号,导入packa中不存在的符号 (do-external-symbols (sym :packb) (unless (find-symbol (symbol-name sym) :packa) (import sym)))
代码说明
do-external-symbols会遍历:packb包的所有导出符号find-symbol检查:packa包中是否存在同名符号(包含packa的内部和导出符号)- 若
packa中无对应符号,则通过import将该符号导入当前的new-pack包
如果只需要排除packa的导出符号(允许导入与packa内部符号同名的packb符号),可以改用find-external-symbol做检查:
(do-external-symbols (sym :packb) (multiple-value-bind (_ status) (find-external-symbol (symbol-name sym) :packa) (declare (ignore _)) (unless status (import sym))))
关于之前尝试的问题
你之前用do-external-symbols+intern/import没生效,大概率是两个原因:
- 执行代码时没有切换到目标包(忘记写
(in-package :new-pack)) - 检查符号存在性时错误使用了
intern(intern会在目标包创建符号,而非检查是否存在),正确的检查方式是用find-symbol或find-external-symbol
内容的提问来源于stack exchange,提问作者Manfred
相关产品推荐
相关产品推荐

