有人告诉我,在lisp中,let
比prog
更快(但prog
有更多的灵活性),在制作变量作用域时。我的问题是:为什么?我的意思是,有些时候使用prog
更容易,但是,除了经验测试,我不知道如何猜测效果。是在分配内存时?是执行吗?循环时它会变得更多吗?我不知道实施差异'细节。
答案 0 :(得分:6)
prog
的说明:
(prog variable-list declaration . body)
== (block nil (let variable-list declaration (tagbody . body)))
换句话说,从功能上讲,prog
是一个严格的超集
let
(小插图除外:前者返回nil
,而后者返回其最后一种形式的value(s)。
一个众所周知的"sufficiently smart
compiler" - 事实上,
任何现代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
您可能想询问实施者。