【问题标题】:prog vs. let in LISP performance differenceprog vs. let in LISP 性能差异
【发布时间】:2018-09-28 20:23:24
【问题描述】:

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

【问题讨论】:

  • 你指的是哪个版本的Scheme? R5RS 和 R6RS 均不包含任何程序。
  • 是Cadnce SKILL++
  • Cadence SKILL++ 似乎是 Franz Lisp 的后裔(它本身有点酷,多年后仍有人在使用它)。 Franz Lisp 可能在 letprog 之间存在性能差异,尽管我找不到任何提及。

标签: scope lisp let


【解决方案1】:

Lisp

prog的描述说:

prog可以用blocklettagbody来解释如下:

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

换句话说,从功能上讲,proglet(除了一个小插曲:前者返回nil,而后者返回最后一种形式的value(s))。

众所周知的"sufficiently smart compiler" - 事实上, any 现代 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++

您可能想询问实施者。

【讨论】:

    猜你喜欢
    • 2015-06-04
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2015-09-30
    • 2012-01-03
    • 1970-01-01
    • 2019-04-21
    • 2010-10-15
    相关资源
    最近更新 更多