编程与LISP表现差异

use*_*991 2 lisp scope let

有人告诉我,在lisp中,在制作变量作用域时,let速度比prog(但prog有更多的灵活性)要快.我的问题是:为什么?我的意思是,有一些时候使用prog更容易,但是,除了经验测试,我不知道如何猜测效果.是在分配内存时?是执行吗?循环时它会变得更多吗?我不知道实现差异的具体细节.

sds*_*sds 6

口齿不清

prog说的描述:

prog可以在以下方面进行说明block,lettagbody如下:

(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)

Cadence SKILL ++

您可能想询问实现者.