在Common Lisp中“打开代码”是什么意思?

时间:2014-01-05 23:11:11

标签: common-lisp

在SBCL用户手册中,有几个对术语“open code”的引用。 Common Lisp黑客在提到优化代码时也会使用这个术语。

请您解释一下“打开代码”的含义并举例说明它是如何工作的?

1 个答案:

答案 0 :(得分:9)

什么

Open-coding, AKA inlining,表示使用内联汇编替换函数调用。 这个想法是funcall是昂贵的(它需要保存和恢复堆栈和c),并用构成该功能的少数操作替换它可能是有益的。

例如,当参数是一个fixnum(它通常在实践中)时,函数1+是一条指令,因此将funcall转换为两个并行分支(fixnum和其他)将是一场胜利。

控制

声明

用户可以通过inline声明明确控制此优化。

用户还可以通过optimize声明来影响此优化。

两者都会影响内联作为函数定义的函数的代码(见下文)。

" old"方法是将函数实现为宏。例如,而不是

(defun last1f (list)
  (car (last list)))

(defmacro last1m (list)
  `(car (last ,list)))

last1m将始终是开放式编码的。这种方法的问题在于您无法将last1m用作函数 - 您无法将其传递给mapcar

因此Common Lisp有另一种方式 - compiler macros,它告诉编译器在编译之前如何转换表单:

(define-compiler-macro last1f (list)
   `(car (last ,list)))

另见上述CLHS页面中的优秀示例。