我安装的一些elisp函数会生成警告:
`flet' is an obsolete macro (as of 24.3); use either `cl-flet' or `cl-letf'.如果我简单地用cl-flet替换所有的flet会有危险吗?如果可以替换它们,哪一个更好?
如果替换它没有危险,我会向项目发送拉取请求。
他们不改变它有什么原因吗?
发布于 2013-09-19 21:15:53
flet既不同于cl-flet也不同于cl-letf。它更危险(也可能更强大)。这就是它被弃用的原因。
因为它是不同的(动态绑定一个函数名),所以您必须在每种情况下都考虑用cl-flet替换它是否合适。
不能用cl-flet替换flet的小示例
(defun adder (a b)
(+ a b))
(defun add-bunch (&rest lst)
(reduce #'adder lst))
(add-bunch 1 2 3 4)
;; 10
(flet ((adder (a b) (* a b)))
(add-bunch 1 2 3 4))
;; 24
(cl-flet ((adder (a b) (* a b)))
(add-bunch 1 2 3 4))
;; 10请注意,cl-flet执行词法绑定,因此adder的行为没有改变,而flet执行动态绑定,这使得add-bunch临时产生阶乘。
发布于 2013-09-20 03:51:10
我最近写了一篇关于这个主题的post。这篇文章的要点是noflet是flet的最佳替代品(如果你需要动态绑定)。它是一个第三方库,但它几乎是flet的临时替代品(同时增加了一些额外的功能)。
发布于 2015-03-09 00:00:46
正如阿图尔在this博客文章中描述的那样,cl-letf函数可用于动态绑定函数。
https://stackoverflow.com/questions/18895605
复制相似问题