gpt4 book ai didi

lisp - LISP 中的 let 与 let* - 效率有区别吗?

转载 作者:太空宇宙 更新时间:2023-11-03 18:45:37 25 4
gpt4 key购买 nike

这应该很快:我一直在问自己,LISP 特殊函数 letlet* 在效率上是否存在差异?例如,当只创建一个变量时它们是等价的吗?

最佳答案

正如 Barmar 指出的那样,“生产就绪”Lisp 不应该有任何性能差异。

对于 CLISP,这两者都产生相同的(字节码)程序集:

(defun foo (x) (let ((a x) (b (* x 2))) (+ a b)))
(defun bar (x) (let* ((a x) (b (* x 2))) (+ a b)))

虽然对于非优化的、简单的解释器(或编译器)来说可能会有很大的不同,例如因为 let*let 可以作为简单的宏来实现,并且具有多个参数的单个 lambda 可能比每个具有单个参数的多个 lambda 更有效:

;; Possible macro expansion for foo's body
(funcall #'(lambda (a b) (+ a b)) x (* x 2))
;; Possible macro expansion for bar's body
(funcall #'(lambda (a) (funcall #'(lambda (b) (+ a b)) (* x 2))) x)

拥有多个 lambda 以及(可避免的)关闭 a 可能会降低第二次扩展的“效率”。

不过,当仅与一个绑定(bind)一起使用时,即使那样也不应该有任何区别。

但如果您使用的实现未优化 let*(或 let),那么讨论性能可能根本没有意义。

关于lisp - LISP 中的 let 与 let* - 效率有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37492997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com