问题描述
比如说,我有以下几点:
(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 (将#修改为@)