这应该是一个快速的问题:我经常问自己,LISP特殊功能let
和let*
之间的效率是否存在差异?例如,它们只在创建一个变量时是等效的吗?
答案 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
)的实现,那么根本就没有必要讨论性能。