在LISP中让vs let * - 效率有差异吗?

时间:2016-05-27 22:13:55

标签: lisp

这应该是一个快速的问题:我经常问自己,LISP特殊功能letlet*之间的效率是否存在差异?例如,它们只在创建一个变量时是等效的吗?

2 个答案:

答案 0 :(得分:3)

不应该有任何性能差异。它们之间的唯一区别是变量的范围,它在编译时处理。如果只有一个变量,则绝对没有区别。

答案 1 :(得分:3)

正如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可能比具有单个参数的多个lambdas更有效:

;; 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)

拥有多个lambdas,以及(可避免)关闭a可以使第二次扩展更少"效率更高"。

当只使用一个绑定时,即使这样,也不应该有任何区别。

但是,如果你使用的是不优化let*(或let)的实现,那么根本就没有必要讨论性能。