编程与LISP表现差异

时间:2018-04-18 14:27:45

标签: scope lisp let

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

1 个答案:

答案 0 :(得分:6)

Lisp的

prog的说明:

  

prog可以用blocklettagbody来解释,如下所示:

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

换句话说,从功能上讲,prog是一个严格的超集 let(小插图除外:前者返回nil,而后者返回其最后一种形式的value(s)

一个众所周知的"sufficiently smart compiler" - 事实上, 任何现代Lisp编译器 - 都可以检测到它 returngo未使用并编译 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++

您可能想询问实施者。