在SBCL用户手册中,有几个对术语" 开放代码 "的引用.Common Lisp黑客在提到优化代码时也会使用这个术语.
你能解释一下"开放代码"的含义并举例说明它是如何工作的吗?
sds*_*sds 10
开放式编码,AKA内联,意味着用内联汇编替换函数调用.这个想法是funcall昂贵的(它需要保存和恢复堆栈和c),并用构成该功能的少数操作替换它可能是有益的.
例如,1+当参数是一个fixnum(它通常在实践中)时,函数是一条指令,因此将funcall转换为两个并行分支(fixnum否则)将是一个胜利.
用户可以通过inline声明明确地控制此优化.
用户还可以通过optimize声明影响此优化.
两者都会影响内联函数的代码作为函数定义(见下文).
"旧"方式是将功能实现为宏.例如,而不是
(defun last1f (list)
(car (last list)))
Run Code Online (Sandbox Code Playgroud)
写
(defmacro last1m (list)
`(car (last ,list)))
Run Code Online (Sandbox Code Playgroud)
并将last1m始终是开放编码的.这种方法的问题在于你last1m不能将它作为一个函数使用- 你不能将它传递给它mapcar.
因此,Common Lisp有另一种方法 - 编译器宏,它告诉编译器在编译之前如何转换表单:
(define-compiler-macro last1f (list)
`(car (last ,list)))
Run Code Online (Sandbox Code Playgroud)
另请参阅上述CLHS页面中的优秀示例.