1

您将如何找出 SBCL(可能还有其他 common-lisp 编译器)如何表示类型化变量。例如,SBCL 将类型为 as 的变量(member +1 -1)转换为 type (or (integer 1 1) (integer -1 -1))。但这有点,一个fixnum,或者甚至是bignum?

4

1 回答 1

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 个字节指向已为实际值分配额外空间的堆对象。

于 2017-02-08T23:34:07.273 回答