prog vs. let in LISP 性能差异



有人告诉我,在Lisp中,在使变量作用域化时,letprog快(但prog有更多的灵活性(。我的问题是:为什么?我的意思是,在某些时候使用prog更容易,但是,除了经验测试,我不知道如何猜测效果。是在分配内存时吗?是执行吗?循环时会更多吗?我不知道实现差异的细节。

Lisp

prog的描述说:

prog可以用blocklettagbody来解释如下:

(prog variable-list declaration . body)
==  (block nil (let variable-list declaration (tagbody . body)))

换句话说,从功能上讲,proglet(除了一个小插图:前者返回nil而后者返回其最后形式的值(。

谚语"足够聪明"编译器" - 事实上,任何现代的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

节奏技能++

您可能需要询问实施者。

最新更新