prog vs. let in LISP 性能差异
Posted
技术标签:
【中文标题】prog vs. let in LISP 性能差异【英文标题】:prog vs. let in LISP performance difference 【发布时间】:2018-09-28 20:23:24 【问题描述】:有人告诉我,在 lisp 中,let
比prog
快(但prog
有更多的灵活性),当使变量作用域时。我的问题是:为什么?我的意思是,在某些时候使用prog
更容易,但是,除了经验测试,我不知道如何猜测效果。是在分配内存的时候吗?是执行吗?循环时它会更多吗?我不知道实现差异的细节。
【问题讨论】:
你指的是哪个版本的Scheme? R5RS 和 R6RS 均不包含任何程序。 是Cadnce SKILL++ Cadence SKILL++ 似乎是 Franz Lisp 的后裔(它本身有点酷,多年后仍有人在使用它)。 Franz Lisp 可能在let
和 prog
之间存在性能差异,尽管我找不到任何提及。
【参考方案1】:
Lisp
prog
的描述说:
prog
可以用block
、let
、tagbody
来解释如下:
(prog variable-list declaration . body)
== (block nil (let variable-list declaration (tagbody . body)))
换句话说,从功能上讲,prog
是
let
(除了一个小插曲:前者返回nil
,而后者返回最后一种形式的value(s))。
众所周知的"sufficiently smart
compiler" - 事实上,
any 现代 Lisp 编译器 - 可以检测到
return
和
go
未使用并编译
prog
等同于 let
:
(disassemble '(lambda () (let ((a 1) (b 2)) (print (+ a b)) nil)))
和
(disassemble '(lambda () (prog ((a 1) (b 2)) (print (+ a b)))))
产生相同的输出:
Disassembly of function :LAMBDA
(CONST 0) = 1
(CONST 1) = 2
0 required arguments
0 optional arguments
No rest parameter
No keyword parameters
7 byte-code instructions:
0 (CONST&PUSH 0) ; 1
1 (CONST&PUSH 1) ; 2
2 (CALLSR&PUSH 2 55) ; +
5 (PUSH-UNBOUND 1)
7 (CALLS1 142) ; PRINT
9 (NIL)
10 (SKIP&RET 1)
NIL
Cadence SKILL++
您可能想询问实施者。
【讨论】:
以上是关于prog vs. let in LISP 性能差异的主要内容,如果未能解决你的问题,请参考以下文章