没有编译器宏的常见 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 的情况下保留 fixnumcompiler-macro

*标题中的“可移植”是因为,SBCL 确实推断 a 即使在其编译后期的 fun-1 内部也是一个fixnum;我想要一种使用 cltl2 实现的可移植到其他实现的方法

**这里的编译器宏仅用于演示目的。我最初的用例涉及为 fun-1 而不是 fun-2 的编译器宏。事实上,这可以使用编译器宏来实现;我想知道是否有没有它们的方法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)