使用Quicklisp与Portacle定义本地Common Lisp系统遇阻求助
Common Lisp包系统实践问题解决
核心问题
- 执行
(ql:quickload "census-api")提示“System not found”,但ql:*local-project-directories*已包含项目目录 - 必须手动编译
packages.lisp才能加载系统,希望无需手动处理文件,直接通过Quicklisp加载 (in-package "census-api")执行失败,改用(in-package :census-api)才生效
问题分析与解决方案
1. 修复ASD文件,让Quicklisp自动加载包定义
你的census-api.asd未包含packages.lisp,这是必须手动加载它的根本原因。包定义需要在其他代码文件前加载,因此要把:file "packages"添加到:components列表最前端。同时原ASD文件的:description部分缺少闭合双引号,这一语法错误也会导致系统识别失败。
修改后的census-api.asd代码:
(defsystem "census-api" :description "A collection of utilities to pull Census, BLS, and Google DistanceMatrix API data. For default use, evaluate the following -- Census: (set-fips), (set-hh-input), (print-hh-output (output-list)) BLS: (set-fips), (print-bls-data (prepare-hashed-bls-data)) Distancematric: (set-location-params), (print-dm-output (get-data (*api-response*))) " :author "Brian LastName <xxxx@gmail.com>" :license "To be determined" :version "0.5" :depends-on ("dexador" "shasht") :serial t :components ((:file "packages") (:file "census-api") (:file "distancematrix-api")))
2. 解决"System not found"问题
- 调整目录结构:将所有项目文件放到
/portacle/projects/census-api/子目录下(而非直接放在/portacle/projects/根目录),Quicklisp要求每个项目有独立的子目录,ASD文件需放在该子目录内。 - 刷新本地项目索引:在Portacle中执行
(ql:register-local-projects),该命令会扫描ql:*local-project-directories*下的所有ASD文件并注册到Quicklisp系统。 - 重启Portacle:确保新的配置和索引生效。
3. 关于in-package的用法问题
你用defpackage #:census-api定义的是关键字符号,而(in-package "census-api")传入的字符串会被转换为当前包(通常是COMMON-LISP-USER)下的符号,和你定义的关键字包并非同一个。正确写法有两种:
(in-package :census-api)
或者
(in-package #:census-api)
前者是更常用的标准写法。
验证步骤
- 将所有文件移至
/portacle/projects/census-api/目录 - 替换为修改后的ASD文件
- 执行
(ql:register-local-projects) - 执行
(ql:quickload "census-api"),此时系统会自动加载所有文件,包括packages.lisp - 用
(in-package :census-api)切换到目标包,即可正常调用函数
内容的提问来源于stack exchange,提问作者Halbert
相关产品推荐
相关产品推荐

