您将如何找出 SBCL(可能还有其他 common-lisp 编译器)如何表示类型化变量。例如,SBCL 将类型为 as 的变量(member +1 -1)
转换为 type (or (integer 1 1) (integer -1 -1))
。但这有点,一个fixnum,或者甚至是bignum?
问问题
155 次
1 回答
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 个字节指向已为实际值分配额外空间的堆对象。
于 2017-02-08T23:34:07.273 回答