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

Common Lisp库中仅make-json函数无法导出问题求助

问题

我在用Common Lisp创建库时遇到了异常,库代码及依赖项目代码如下:

库文件内容

; in my-lib.asd
(asdf:defsystem :my-lib
  :depends-on (:cl-json :clsql :clsql-sqlite3)
  :components ((:file "package")
               (:file "functions")
               (:file "macros")))
; in package.lisp
(defpackage :my-lib
  (:import-from :cl-json :encode-json-to-string)
  (:use :cl)
  (:export :use-db
           :make-json
           :cwd
           :status-update))
; in functions.lisp
(in-package :my-lib)
....
(defun make-json (a-list)
  (encode-json-to-string a-list))
(defun change-to-path (project-name)
  (uiop:chdir (merge-pathnames project-name "~/quicklisp/local-projects/")))
(defun cwd ()
  (uiop/os:getcwd))
.....

依赖该库的项目代码

;; in project.asd
(asdf:defsystem :project
  :depends-on (:dexador :clsql :clsql-sqlite3 :my-lib :cl-csv :uiop)
;; in package.lisp
(defpackage :project
  (:shadowing-import-from :cl-csv :read-csv)
  (:use :cl :my-lib))

当前问题:

  • 持续收到错误提示:The symbol "MAKE-JSON" is not external in the MY-LIB package
  • 其他导出的函数均可正常使用,仅make-json无法被识别为外部符号
  • 查看my-lib外部符号列表时,确实没有make-json:

(do-external-symbols (s (find-package 'my-lib))
(print s))

MY-LIB:STATUS-UPDATE
MY-LIB:REM-VAR
MY-LIB:CWD
MY-LIB:CHANGE-TO-PATH
NIL

更新信息:只有手动编译my-lib的defpackage代码时,make-json才会被加入导出列表;使用(asdf:load-asd "my-lib")加载系统仍会报错。

原因分析与解决方法

核心原因

  1. ASDF缓存未更新:ASDF会缓存系统定义和编译后的文件,若修改package.lisp的导出列表后未重新编译整个系统,ASDF会继续使用旧缓存,导致新添加的make-json不被识别。
  2. load-asd仅加载系统定义:(asdf:load-asd "my-lib")只是读取.asd文件的系统配置,不会编译或加载package.lisp、functions.lisp等组件文件,修改后的导出规则自然不会生效。

解决步骤

  • 强制重新编译加载整个系统:
    执行以下命令,让ASDF重新处理所有文件并更新缓存:

    (asdf:load-system :my-lib :force t)
    

    其中:force t参数会强制ASDF重新编译所有依赖文件,确保新的导出列表被应用。

  • 清理编译缓存(可选):
    如果强制加载仍无效,可手动清理my-lib的编译缓存:

    1. 找到缓存目录(通常在~/.cache/common-lisp/<你的Lisp实现>/<系统路径>下)
    2. 删除该目录下my-lib相关的文件,再重新执行(asdf:load-system :my-lib :force t)。
  • 验证导出状态:
    加载系统后,重新执行外部符号检查命令,确认make-json已被导出:

    (do-external-symbols (s (find-package 'my-lib)) (print s))
    
  • 更新依赖项目:
    确保依赖my-lib的project系统也被重新加载,避免使用旧缓存:

    (asdf:load-system :project :force t)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:30:31