2013-08-08 30 views
6

Ich habe ein großartiges Beispiel für die Typprüfung in LispWorks Hyper Spec gefunden, aber der Link "Typspezifizierer" führt zu einem bloßen Glossar, nicht zu der Bezeichnung, und ich bin ein wenig mit der Syntax verwirrt.Typspezifizierer in Common Lisp verstehen

In (check-type n (integer 0 *) "a positive integer") Was bedeutet (integer 0 *) bedeuten? Ich nehme an, es bedeutet inklusive Bereich von 0 bis unendlich, aber ist das so?

+0

es bedeutet eine ganze Zahl gleich oder größer als Null ist (erste ist die untere Grenze ist die höhere Grenze). –

Antwort

4

Ja, Sie können Typspezifizierer in Lisp verwenden, sie können sehr mächtig sein, wenn Ihr Compiler sie verwendet. Während Sie für Check-Typ Verwendungen finden können, sind die häufigsten Arten von Typenspezifikationen in Form von declarations.

Der Ausdruck declare ist nicht nur für Typen verwendet, aber es hat eine Anzahl von declaration identifiers und gemeinsame Lisp-Implementierungen sind eigentlich frei, ihre eigenen hinzuzufügen.

Das Bit, das Sie interessiert, ist jedoch 'types' und genauer als das 'Type Specifiers'. Auf dieser Seite können Sie verschiedene Arten angeben, um Typen anzugeben, einschließlich der Art und Weise, wie Sie in Ihrer Frage erwähnt haben.

Beachten Sie wieder, dass Ihre Implementierung die Deklarationen nicht verwenden muss, um sie zu ignorieren! Here is some more info on that.

Und für einige Beispielcode, hier ist das Beispiel, das mir die Grundlagen wie das funktioniert hat. Here und mehr here.

Vom 4.2.3 Type Specifiers:

Wenn ein Typspezifizierer eine Liste ist, ist das Auto der Liste ein Symbol, und der Rest der Liste ist Tochtergesellschaft Typinformationen. Ein solcher Spezifizierer vom Typ wird als Spezifizierer für zusammengesetzte Typen bezeichnet. Sofern nicht ausdrücklich anders angegeben, können die Nebenpositionen nicht spezifiziert werden. Die nicht spezifizierten Nebenposten werden durch Schreiben * angezeigt. Um zum Beispiel einen Vektor vollständig zu spezifizieren, muss der Typ der Elemente und die Länge des Vektors vorhanden sein.

(vector double-float 100) 

Nachfolgend lässt die Länge nicht spezifiziert:

(vector double-float *) 

Nachstehend verlässt den Elementtyp nicht spezifiziert:

(vector * 100)