ACL Windows下Quicklisp加载模块报错,已临时修复求官方补丁
在Windows ACL环境下Quicklisp加载模块的数组操作错误与解决方案
问题现象
- 在Windows平台的Allegro Common Lisp(ACL)环境中,执行
(ql:quickload "vecto")触发错误:Error: Attempt to do an array operation on nil which is not an array. - 通过
:zoo调试追踪到错误调用链:(error type-error :datum ...) ->(ql-cdb::add-record #(49 97 109) #(49 97 109 ...) ...) - 该问题并非单一模块问题,使用
quickload加载任意模块时都会触发
临时修复方案
问题根源是ACL环境中map-into的行为不符合预期——Common Lisp标准中map-into应返回目标数组,但在此场景下它返回了nil。修改quicklisp的cdb.lisp文件中cdb-writer类的默认初始化参数即可修复:
修改前代码
(defclass cdb-writer () ((buckets :initarg :buckets :accessor buckets) (end-of-records-position :initarg :end-of-records-position :accessor end-of-records-position) (output :initarg :output :accessor output)) (:default-initargs :end-of-records-position 2048 :buckets (map-into (make-array 256) (lambda () (make-instance 'hash-table-bucket)))))
修改后代码
(defclass cdb-writer () ((buckets :initarg :buckets :accessor buckets) (end-of-records-position :initarg :end-of-records-position :accessor end-of-records-position) (output :initarg :output :accessor output)) (:default-initargs :end-of-records-position 2048 ;; 原map-into调用返回nil而非数组,显式绑定变量确保返回数组 :buckets (let ((a (make-array 256))) (map-into a (lambda () (make-instance 'hash-table-bucket))) a)))
通过显式创建并绑定数组变量,确保最终返回的是初始化完成的数组,而非nil,修复后问题即可解决。
关于官方补丁的说明
- 该问题属于ACL平台与Common Lisp标准在
map-into行为上的差异导致,Quicklisp官方是否有补丁取决于是否已经收录该平台兼容性问题。 - 建议先尝试更新Quicklisp到最新的beta版本,看是否已经包含针对该问题的修复。
- 若最新版本仍未修复,可将该问题反馈到Quicklisp的官方代码仓库,提交兼容性修复的issue或PR。
内容的提问来源于stack exchange,提问作者LPoint
相关产品推荐
相关产品推荐

