在SBCL用户手册中,有几个对术语“open code”的引用。 Common Lisp黑客在提到优化代码时也会使用这个术语。
请您解释一下“打开代码”的含义并举例说明它是如何工作的?
答案 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页面中的优秀示例。