2017-02-08 4 views
1

Wie finden Sie heraus, wie SBCL (und vielleicht andere Common-Lisp Compiler) eine typisierte Variable darstellt. Beispielsweise übersetzt SBCL eine Variable, die als (member +1 -1) in Typ (or (integer 1 1) (integer -1 -1)) typisiert wird. Aber ist das ein bisschen, ein Fixnum oder vielleicht sogar Bignum?Darstellung einer binären Variablen

+0

_Hinweis zur Klärung eines Missverständnisses in meiner Ausgangsfrage (oben): Variablen haben keine Typen. Die Lisp-Objekte, auf die Variablen (und andere Platzreferenzen) verweisen, sind jedoch typisiert. Eine bessere Aussage des Themas könnte sein: Repräsentation des Wertes einer binären Variable._ – davypough

Antwort

4

Gut. Es ist leicht zu überprüfen:

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

So -1 und 1 verschiedenen Typen sind, wie Sie Mehrfachvererbung in CL haben, so dass es wahr ist, dass 1 und -1 viele viele andere Arten sie gemeinsam haben, sind:

(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 

Und natürlich:

(typep -1 '(member +1 -1)) ; ==> t 
(typep 1 '(member +1 -1)) ; ==> t 

1 Also nur ein bisschen beide sind fixnum und keine sind bignums. Die Werte werden höchstwahrscheinlich im Zeiger in den CL-Implementierungen gespeichert, die dies tun. Beachten Sie, dass dieser Typ wenig mit dem eigentlichen Speicher zu tun hat. Beide Werte werden höchstwahrscheinlich als vollständiges Maschinenwort gespeichert, in meinem Fall 8 Bytes (64 Bits) im Zeiger. Für ein Bignum haben Sie die 8 Bytes, um auf ein Heap-Objekt zu zeigen, das zusätzlichen Speicherplatz für den tatsächlichen Wert zugewiesen hat.

+0

SBCL kann spezialisierten Speicher für bestimmte Nummernbereiche haben, zum Beispiel in Vektoren. '(upgraded-array-element-type '(integer 0 1))' -> 'BIT' –

+0

@RainerJoswig Also könnte es Bits in Vektoren kompakter speichern, aber wahrscheinlich nicht OPs zwei alternative Werte, die mehr Mapping erfordern würde? – Sylwester

+0

Grundsätzlich ein '(SIGNED-BYTE 8)' Array. –

Verwandte Themen