在 LISP 中,let vs let* - 效率是否有差异

  • 本文关键字:let 是否 效率 LISP vs lisp
  • 更新时间 :
  • 英文 :


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

正如 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),那么讨论性能可能根本没有意义。

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

最新更新