在当前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)
的条件是知道参数x
和y
都是fixnum
类型,而转换成(string-+ x y)
的条件则是知道参数和x
均为y
类型。所以问题是:
我真的可以这样做吗?
这样做并生成其他基于用户的转换/扩展的实际机制是什么?
除了手动阅读源以发现与此有关的更多信息以外,还有其他阅读或源吗?
如果我不能使用deftransform之类的方法执行此操作,还有其他方法可以执行此操作吗?
注意:我知道一般的通用Lisp编码中的宏和泛型函数的操作和性质,并且不考虑使用它们来回答这个问题,因为我特别想扩展SBCL内部结构并与其交互编译器。
最佳答案
您可以使用portable在define-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/