有人告诉我,在lisp中,在制作变量作用域时,let速度比prog(但prog有更多的灵活性)要快.我的问题是:为什么?我的意思是,有一些时候使用prog更容易,但是,除了经验测试,我不知道如何猜测效果.是在分配内存时?是执行吗?循环时它会变得更多吗?我不知道实现差异的具体细节.
prog说的描述:
(prog variable-list declaration . body)
== (block nil (let variable-list declaration (tagbody . body)))
Run Code Online (Sandbox Code Playgroud)
换言之,在功能上来讲,prog是一个严格的超集
let(除了少量晕影:前者返回nil而后者返回值(一个或多个)它的最后形式的).
一个众所周知的"足够智能的编译器" - 事实上,
任何现代的Lisp编译器 - 都可以检测到
return并且
go不使用它并且prog相同地编译
到等价物let:
(disassemble '(lambda () (let ((a 1) (b 2)) (print (+ a b)) nil)))
Run Code Online (Sandbox Code Playgroud)
和
(disassemble '(lambda () (prog ((a 1) (b 2)) (print (+ a b)))))
Run Code Online (Sandbox Code Playgroud)
产生相同的输出:
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
Run Code Online (Sandbox Code Playgroud)
您可能想询问实现者.
| 归档时间: |
|
| 查看次数: |
462 次 |
| 最近记录: |