Common lisp “这对”意味着什么;开放代码“;有什么共同的口齿不清吗?

Common lisp “这对”意味着什么;开放代码“;有什么共同的口齿不清吗?,common-lisp,Common Lisp,SBCL用户手册中多次提到术语“”。常见的Lisp黑客在提到优化代码时也使用这个术语 你能解释一下“打开代码”是什么意思,并举例说明它是如何工作的吗?什么 ,表示用内联程序集替换函数调用。 其想法是funcall成本高昂(需要保存和恢复堆栈&c),用构成函数的少量操作替换它可能是有益的 例如,当参数是fixnum时,函数1+//code>是一条指令(实际上通常是这样),因此将funcall转换为两个并行分支(fixnum或其他)将是一个胜利 控制 声明 用户可以通过声明显式地控制此优化 用户还可

SBCL用户手册中多次提到术语“”。常见的Lisp黑客在提到优化代码时也使用这个术语

你能解释一下“打开代码”是什么意思,并举例说明它是如何工作的吗?

什么 ,表示用内联程序集替换函数调用。 其想法是
funcall
成本高昂(需要保存和恢复堆栈&c),用构成函数的少量操作替换它可能是有益的

例如,当参数是fixnum时,函数
1+//code>是一条指令(实际上通常是这样),因此将funcall转换为两个并行分支(
fixnum
或其他)将是一个胜利

控制 声明 用户可以通过声明显式地控制此优化

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

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

宏 “旧”方法是将函数作为宏来实现。例如,代替

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

last1m
将始终处于打开编码状态。这种方法的问题是不能将
last1m
用作函数-不能将其传递给(比如)mapcar

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

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

另请参见前面链接的CLHS页面中的优秀示例。

第4.5节非常明确地解释了它:它是内联的。甚至还有一个例子。有没有不清楚的地方?对不起,我忽略了。我还阅读了一些文献,其中“开放代码”一词似乎用于其他用途,因此需要澄清。这一术语似乎主要用于SBCL社区。谢谢@sds,开放编码是否也与“编译器宏”有关系,还是与之无关?不客气;请参见编辑宏和编译器宏
(define-compiler-macro last1f (list)
   `(car (last ,list)))