这应该是一个快速的问题:我一直在问自己,LISP特殊函数let
和let*
之间是否存在效率差异?例如,当只创建一个变量时,它们是否等效?
正如 Barmar 指出的那样,"生产就绪"Lisps 不应该有任何性能差异。
对于 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
可能会降低第二次扩展的"效率"。
但是,当仅与一个绑定一起使用时,即使这样也应该没有任何区别。
但是,如果您使用的实现没有优化let*
(或let
),那么讨论性能可能根本没有意义。
应该没有任何性能差异。它们之间的唯一区别是变量的作用域,这是在编译时处理的。如果只有一个变量,则绝对没有区别。