如何解决没有编译器宏的常见 lisp 内联函数中的可移植类型传播
比如说,我有以下几点:
(declaim (inline fun-1 fun-2))
(defun fun-1 (a)
a)
(define-compiler-macro fun-1 (&whole form a &environment env)
(print (introspect-environment:variable-type a env))
form)
(defun fun-2 (a)
(declare (type number a))
(fun-1 a))
(define-compiler-macro fun-2 (&whole form a &environment env)
(print (introspect-environment:variable-type a env))
form)
然后,在编译 (fun-2 a)
表单时,额外的类型信息会丢失。
CL-USER> (compile nil `(lambda (a)
(declare (type fixnum a))
(fun-2 a)))
FIxnuM
NUMBER
#<FUNCTION (LAMBDA (A)) {52E6BBDB}>
NIL
NIL
有没有办法在不使用 a
的情况下保留 fixnum
是 compiler-macro
?
*标题中的“可移植”是因为,SBCL 确实推断 a
即使在其编译后期的 fun-1
内部也是一个fixnum;我想要一种使用 cltl2 实现的可移植到其他实现的方法。
**这里的编译器宏仅用于演示目的。我最初的用例涉及为 fun-1
而不是 fun-2
的编译器宏。事实上,这可以使用编译器宏来实现;我想知道是否有没有它们的方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。