您如何知道SBCL(以及其他常见的lisp编译器)如何表示类型变量。例如,SBCL将类型为(member +1 -1)
的变量转换为类型(or (integer 1 1) (integer -1 -1))
。但这有点像一个固定的,甚至可能是bignum吗?
答案 0 :(得分:4)
好。这很容易检查:
(type-of 1)
; ==> BIT
(type-of -1)
; ==> (integer -281474976710656 (0))
所以-1
和1
属于不同的类型,但是你在CL中有多个继承,所以1
和-1
是很多其他类型的共享常见的有:
(typep 1 'integer) ; ==> t
(typep 1 'fixnum) ; ==> t
(typep 1 'number) ; ==> t
(typep 1 't) ; ==> t
(typep 1 'bignum) ; ==> nil
(typep -1 'integer) ; ==> t
(typep -1 'fixnum) ; ==> t
(typep -1 'number) ; ==> t
(typep -1 't) ; ==> t
(typep -1 'bignum) ; ==> nil
当然:
(typep -1 '(member +1 -1)) ; ==> t
(typep 1 '(member +1 -1)) ; ==> t
所以只有1
有点,两者都是fixnum,没有一个是bignums。这些值很可能存储在CL实现中的指针中。请注意,类型与实际存储无关。这两个值很可能存储为指针中的整个机器字,在我的情况下是8字节(64位)。对于bignum,您有8个字节指向已为实际值分配额外空间的堆对象。