Wie geläufig lisp, wie kann ich den Typ eines Objekts auf eine tragbare Weise überprüfen

8

Ich möchte eine Methode definieren, die sich auf ein Objekt vom Typ Array mit unsignierten Byte-8-Elementen spezialisiert. In sbcl, wenn Sie (make-array x :element-type '(unsigned-byte 8)) haben, wird die Objektklasse von SB-KERNEL :: SIMPLE-ARRAY-UNSIGNED-BYTE-8 implementiert. Gibt es einen implementierungsunabhängigen Weg zur Spezialisierung auf Array-Typen ohne Vorzeichen?

    
Paralife 21.05.2011, 17:12
quelle

3 Antworten

11

Verwenden Sie einen Scharfzeichner, um die implementierungsabhängige Objektklasse zur Lesezeit einzufügen:

%Vor%

Der sharpsign-dot Reader-Makro wertet das Formular zur Lesezeit aus und bestimmt die Klasse des Arrays. Die Methode wird auf die Klasse spezialisiert, die die bestimmte Common Lisp-Implementierung für das Array verwendet.

    
Terje Norderhaug 21.05.2011, 17:52
quelle
4

Beachten Sie, dass das :ELEMENT-TYPE Argument für MAKE-ARRAY etwas Spezielles tut und sein genaues Verhalten etwas überraschend ist.

Wenn Sie es verwenden, sagen Sie Common Lisp, dass das ARRAY Elemente dieses Elementtyps oder einige seiner Untertypen speichern kann.

Das Common-Lisp-System gibt dann ein Array zurück, das diese Elemente speichern kann. Es kann ein spezialisiertes Array oder ein Array sein, das auch allgemeinere Elemente speichern kann.

Hinweis: Es handelt sich nicht um eine Typdeklaration und es wird nicht unbedingt bei der Kompilierung oder Laufzeit überprüft.

Die Funktion UPGRADED-ARRAY-ELEMENT-TYPE sagt Ihnen, auf welches Element ein Array tatsächlich aktualisiert werden kann.

LispWorks 64bit:

%Vor%

Lispworks 64bit hat also spezielle Arrays für 4- und 8-Bit-Elemente. Bei 12-Bit-Elementen wird ein Array zugewiesen, das bis zu 16-Bit-Elemente speichern kann.

Wir erzeugen ein Array, das zehn Zahlen von bis zu 12 Bits speichern kann:

%Vor%

Überprüfen wir den Typ:

%Vor%

Es ist ein einfaches Array (nicht einstellbar, kein Füllzeiger). Es kann Elemente vom Typ (UNSIGNED-BYTE 16) und seine Subtypen speichern. Es ist von Länge 10 und hat eine Dimension.

    
Rainer Joswig 23.05.2011 18:20
quelle
0

In einer normalen Funktion könnten Sie etypecase verwenden, um den Versand durchzuführen:

Der folgende Code ist nicht in sich abgeschlossen, sollte aber eine Idee zur Implementierung enthalten eine Funktion, die punktweise Operationen ausführt, wenn das gerade für 3D-Arrays:

%Vor%

Hier ist der Code:

%Vor%     
whoplisp 03.07.2011 09:08
quelle

Tags und Links