微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

没有编译器宏的常见 lisp 内联函数中的可移植类型传播

如何解决没有编译器宏的常见 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 举报,一经查实,本站将立刻删除。