如何在Portacle IDE中部署Common Music?加载报错求助
解决Common Music在Portacle中加载时的SB-UNIX符号错误
我之前在把Common Music部署到Portacle时也碰到过完全一样的问题,本质是老版本的Common Music代码和新版SBCL的SB-UNIX API不兼容——sb-unix:unix-file-kind这个符号在较新的SBCL版本里已经被移除或替换了,咱们一步步来修复:
1. 定位并修改问题代码
首先打开报错的文件/usr/local/lisp/cm/cm.asd,找到第116行的代码,你会看到它调用了sb-unix:unix-file-kind这个废弃的函数。
我们可以用Portacle自带的UIOP工具库来替换它——UIOP是Common Lisp的标准跨平台工具库,兼容性更好,用法也更简洁:
- 把原来的
(sb-unix:unix-file-kind ...)调用,替换成(uiop:file-kind ...)
举个例子,如果原代码是:
(when (eq (sb-unix:unix-file-kind path) :directory) ...)
替换后变成:
(when (eq (uiop:file-kind path) :directory) ...)
如果坚持要用SBCL原生API,也可以用sb-posix:stat来实现相同逻辑(不过更推荐UIOP,通用性更强):
(let ((stat (sb-posix:stat path))) (when stat (eq (logand (sb-posix:stat-mode stat) #o170000) #o040000))) ; 判断是否为目录
2. 重新加载Common Music
修改保存后,回到Portacle的REPL,重新加载ASD文件:
(load "/usr/local/lisp/cm/cm.asd")
然后尝试加载Common Music系统:
(asdf:load-system :cm)
额外提示
Common Music是比较老旧的项目,CVS上的源码很久没有更新了,后续可能还会碰到其他和新版SBCL不兼容的问题。如果遇到类似的符号缺失错误,优先考虑用UIOP的跨平台函数替换旧的SB-UNIX/SB-POSIX调用,或者查找SBCL的版本变更日志,找到对应符号的替代方案。
内容的提问来源于stack exchange,提问作者BBenyani
相关产品推荐
相关产品推荐

