最新的 emacs 27 会对 (eval-when-compile (require 'cl))
报这个警告。用什么替换比较好?单纯 with-no-warnings
?
cireu
5
又不是没有lexical-binding,为什么要用lexical-let
???
cireu
8
defvar
声明的变量是可以继续dynamically bound的。实在不行用cl-progv
自己配置用的就with-no-warnings呗。lexical binding从24引入,cl package从24.3开始就被cl-lib代替了。现在都过来7年了,还用着过年啊
1 个赞
(eval-when-compile (setq lexical-binding t))
不就行了
也可以试试 eval,eval 的可选参数可以控制 lexical scoping 的开关的
EmacsLisp中的静态作用域与动态作用域
开启 lexical scoping
(eval
'(let ((i1 0))
(defun my-test ()
(let ((i2 0))
(prog1
(list i1 i2)
(setq i1 (1+ i1))
(setq i2 (1+ i2))))))
t)
(my-test) ; => (0 0)
(my-test) ; => (1 0)
(my-test) ; => (2 0)
关闭 lexical scoping
(eval
'(let ((i1 0))
(defun my-test ()
(let ((i2 0))
(prog1
(list i1 i2)
(setq i1 (1+ i1))
(setq i2 (1+ i2))))))
nil)
执行 (my-test)
直接报错
eval很坑爹,只能手动传lexical env,不是开了就自动有
我看有一堆都用了 这个’cl 啊,都不知道那警告是出于哪一个~~
1 个赞
升级到 Emacs 27
就有这个警告了,很多的 packages
都 require
了 cl
cd ~/.emacs.d/elpa
rg "require 'cl\)" .
(setq byte-compile-warnings '(cl-functions))
将这个写到 init.el
就没有警告了。
1 个赞
升级到27之后我也遇到了同样的问题,把上边的话放在init.el里解决,但是必须放在加载一些包之前,具体是哪个还没有一一排查。
1 个赞
最后我把我的配置拆成了很多文件,有的开 lexical binding,有的不开。我用的包比较少,很早之前就没有用 cl 的了。
用如下的语句应该能得到cl依赖的包:
(require 'loadhist)
(file-dependents (feature-file 'cl))
9 个赞
我们坐等着相应包的升级啊?~
还是找到相应的包进行替换 ( cl-mac
cl-lib
)
哪个大牛能不能讨论下使用影响?