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

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没生效,大概率是两个原因:

  1. 执行代码时没有切换到目标包(忘记写(in-package :new-pack))
  2. 检查符号存在性时错误使用了intern(intern会在目标包创建符号,而非检查是否存在),正确的检查方式是用find-symbol或find-external-symbol

内容的提问来源于stack exchange,提问作者Manfred

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:10:14