(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
)
哪个大牛能不能讨论下使用影响?
使用上短期内应该没太大影响。
目前大多数 cl-
函数就是归类到不同的子文件,然后在 cl.el 再声明一个别名:
所以 (require 'cl)
就还能使用到原先那些函数,只不过会收到警告。
函数本身并没有什么改动。要是改动太多的话,估计 Emacs 生态圈都要崩了。
3 个赞
zhua
23
我有用一些 较老的包, 这些包是 不可能, 再会有人 更新的, 真担心 「万一」 弃用了, 我可不会改
zhua
25
zhua
28
大概看了下, eyebrowse 以前也有试过, persp-mode 也看了下, workgroups 也粗看了下, 可能我理解的不对, 这几个包 针对的是 较普遍性的, 我想用的是 window-layout 这种 api 的, 它可操作性 与自定义性, 比较强, 那这几个包了, 可能也有 开放 一些 API, 我没看, 也应该 也是看不会的, window-layout 较直观些, 好像 代码也不长, 当做学习, 我是边用边学的, 如有点底了, 就自己改吧, 把 cl 改成 cl-lib, 我想用好 emacs 还是要在关键的时候, 自己会改些