[Common Lisp]求助: cl-base64 加载异常失败??


新的一台机, 安装了半天需要的程序, 解决了重重障碍, 但是就有一个莫名其妙的
我安装的postgrespostmodern 调用的cl-base64 提示错误, 我跳进源代码对比了其它机器(运行正常)也是一样, 我猜想是不是跟这里有2个版本有关? 但是其它机器也是有2个版本…

image

我单独去加载这个代码库 看起来正常, 有自动帮你填充函数, 但是调用又确实提示不存在(下面提示栏buffer也没有提示函数参数)

我删了quicklisp 全部重装, 然后先只安装了 postmodern, 然后在控制台上直接sbcl加载数据库正常了, 然后就以为解决了, 但是回到 SLIME(会加载自己的代码库), 加载自己的代码库和载入这个数据库还是失败, 直接回去sbcl加载也失败…
搜了半天也没看到类似的遭遇, 求助 (跟其它机器一个区别就是 sbcl 我装的是最新的 2.1.3

我好像是找到原因了, 是新版本(20201016)把名字强制变为了小写

我尝试调用旧版本(20150923)覆盖新版本, 名字是大写, 调用本正常了(我也是今天才升级的quicklisp update-all)…

在加载 postmodern 的时候是加载 2015 版本的, 后面自动安装的其它代码库又安装了 2020 的覆盖了2015版本的, 所以…



所以罪魁祸首应该就是 (ql:update-all-dists)
请教如何替换 quicklisp 某个库的版本啊? 默认都会下载最新的


你猜怎么着,默认新开个 CL 行为是这样:

所以显然是你动了某个变量,比如 *print-case*


显然用正常设定编译出来的 SBCL 2.1.3 是没有问题的,如果你没有做什么定制那说明你装的有问題。

2 个赞

确实我是在 .sbclrc 里就加了 (setf *print-case* :downcase)和加载自己的代码库

(另外: 我去掉 :downcase 后没有立刻解决, 因为默认是编译缓存过来的, 所以我要清掉cl-base64缓存 再载入项目(自动安装被清掉的库) 载入成功了! )
然后再加回 :downcase, 也正常, 因为缓存好了!
我想该代码库作者可以加一个 (let ((*print-case* :upcase)) ...) 来解决这个问题, Dynamic Variable 的副作用啊(想我这样把 *print-case* 设为 :downcase 觉得更好看的很少吗?)

因为其它机器也是一样(同一个git)的:downcase 却正常, 所以没有想到这问题
谢主隆恩!! :ninja:

那你同时得加上 (setf (readtable-case *readtable*) :invert)

http://www.lispworks.com/reference/HyperSpec/Body/22_accba.htm

然后再 redefine 下 cl:intern 让它也 invert case。

祸根应该是我的调用顺序搞错了, 我在加载(然后会缓存编译)完全部第三方库之前就 (setf *print-case*...)导致, 我现在等加载完代码库([quickload])再设置 *print-case*就可以了:


之前(一年前)想要早点从 *inferior-lisp* 进入 *slime-repl* buffer, 所以在另外一个线程[ (schedule-timer (make-timer .... )来加载自己的代码库
谢谢找到祸根, 就是不能在加载完代码库之前修改全局变量(例如*print-case*)