表示二进制变量

时间:2017-02-08 22:49:13

标签: common-lisp data-representation

您如何知道SBCL(以及其他常见的lisp编译器)如何表示类型变量。例如,SBCL将类型为(member +1 -1)的变量转换为类型(or (integer 1 1) (integer -1 -1))。但这有点像一个固定的,甚至可能是bignum吗?

1 个答案:

答案 0 :(得分:4)

好。这很容易检查:

(type-of 1)
; ==> BIT
(type-of -1)
; ==> (integer -281474976710656 (0))

所以-11属于不同的类型,但是你在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个字节指向已为实际值分配额外空间的堆对象。