Package cl is deprecated

最新的 emacs 27 会对 (eval-when-compile (require 'cl)) 报这个警告。用什么替换比较好?单纯 with-no-warnings

(require 'cl-lib)代替

cl-mac cl-lib

这两有lexical-let吗?

又不是没有lexical-binding,为什么要用lexical-let???

+1,这种遗留代码就该就地正法

配置文件写点怎么了?有的变量要有的变量不要。

defvar声明的变量是可以继续dynamically bound的。实在不行用cl-progv

%E5%9B%BE%E7%89%87

自己配置用的就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 啊,都不知道那警告是出于哪一个~~

升级到 Emacs 27 就有这个警告了,很多的 packagesrequirecl

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 个赞

感谢提供,我这边是adoc-mode这个包。

我们坐等着相应包的升级啊?~

还是找到相应的包进行替换 ( cl-mac cl-lib

哪个大牛能不能讨论下使用影响?