在当前SBCL手册第6.5节的末尾,我们有以下引用:


如果您的系统性能由于某种原则上可以有效地编译但SBCL编译器实际上不能有效编译的构造而受到影响,请考虑向该编译器编写补丁并将其提交以包括在主要资源中。这样的代码通常很容易编写。在源中搜索字符串“ deftransform”,以找到许多示例(有些简单,有些则不太简单)。


我一直在玩耍,发现sb-c :: defknown和sb-c :: deftransform之类的东西,但是到目前为止,成功添加任何可以做任何事情的新转换的运气并不好。

假设我具有以下3个玩具功能:

(defun new-+ (x y)
  (+ x y))

(defun fixnum-+ (x y)
  (declare (optimize (speed 3) (safety 0))
           (fixnum x y))
  (+ x y))

(defun string-+ (x y)
  (declare (optimize (speed 3) (safety 0))
           (string x y))
  (concatenate 'string x y))


举一个纯粹的玩具示例,让我们告诉编译器,它可以将对用户定义的函数new-+的调用转换为对fixnum- +或string- +的调用。

编译器将(new-+ x y)转换为(fixnum-+ x y)的条件是知道参数xy都是fixnum类型,而转换成(string-+ x y)的条件则是知道参数和x均为y类型。

所以问题是:


我真的可以这样做吗?
这样做并生成其他基于用户的转换/扩展的实际机制是什么?
除了手动阅读源以发现与此有关的更多信息以外,还有其他阅读或源吗?
如果我不能使用deftransform之类的方法执行此操作,还有其他方法可以执行此操作吗?


注意:我知道一般的通用Lisp编码中的宏和泛型函数的操作和性质,并且不考虑使用它们来回答这个问题,因为我特别想扩展SBCL内部结构并与其交互编译器。

最佳答案

您可以使用portabledefine-compiler-macro Common Lisp中实现所需的功能

AFAIK读取SBCL来源是了解deftransform如何工作的唯一方法。但是在探究SBCL来源之前,请先检查Paul Khuong的Starting to Hack on SBCL或至少是The Python Compiler for CMU Common Lisp链接,以概述SBCL的工作原理。

关于common-lisp - 在SBCL内部使用deftransform/defknown获取编译器来转换用户编写的函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44342104/

10-11 21:51