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

tus*_*and 6 common-lisp

在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页面中的优秀示例.