新的一台机, 安装了半天需要的程序, 解决了重重障碍, 但是就有一个莫名其妙的
我安装的
postgres
库
postmodern
调用的
cl-base64
提示错误, 我跳进源代码对比了其它机器(运行正常)也是一样, 我猜想是不是跟这里有2个版本有关? 但是其它机器也是有2个版本…
我单独去加载这个代码库 看起来正常, 有自动帮你填充函数, 但是调用又确实提示不存在(下面提示栏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
却正常, 所以没有想到这问题
谢主隆恩!! 
那你同时得加上 (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*
)