Frage

Problem:

Ich suche gute Einführung über Typ Systeme , die basieren auf Verträge / Einschränkungen
(sorry, ich erinnere mich nicht, welchen Begriff ein für ein Typ-System geeignet ist) .

Ich brauche diese Informationen, um eine experimentelle Art System dieser Art zu realisieren.

Soweit ich weiß, wie Typ-System wird verwendet, in XSD (XML Schema Definition).

Statt einen Datentyp zu definieren, definiert man Zwänge auf dem Satz von möglichen Werten.

Beispiel:

I definieren eine Methode mit einem Parameter, der entweder "nothing" ist oder entspricht der Integralbereich [0..100].

Ein solches Verfahren würde akzeptieren folgende Werte:

"nothing"
0
1
...
100

Ich hoffe, ich konnte mich selbst klar machen.

War es hilfreich?

Lösung

Common Lisp Angebote wie Typprüfung in Laufzeit . Es verfügt über ein ausgeklügeltes System-Typ, aber es wird nicht verwendet, da sie in einer zu statisch typisierte Sprache gewöhnt werden könnten. Das Makro check-type akzeptiert eine typespec , die eine eingebaute in der Spezifikation oder eine durch das Makro definiert sein kann deftype . Die Einschränkungen ausdruecken mit typespecs ist die eine Prädikats-Funktion in der Host-Sprache geschrieben, die dass alles, was zu sagen ist, dass Sie eine Laufzeit kontrollieren können, können die Kriterien für das sein, was Ihre neue Art darstellt.

Betrachten Sie dieses Beispiel:

(defun is-nothing (val)
  (when (stringp val)
    (string= val "nothing")))

(deftype strange-range ()
  "A number between 0 and 100 inclusive, or the string \"nothing\"."
  '(or (integer 0 100)
       (satisfies is-nothing)))

, die definiert, eine Art „seltsame-range“ genannt. Testen Sie nun ein paar Werte dagegen:

CL-USER> (let ((n 0))
           (check-type n strange-range))
NIL
CL-USER> (let ((n 100))
           (check-type n strange-range))
NIL
CL-USER> (let ((n "nothing"))
           (check-type n strange-range))
NIL
CL-USER> (let ((n 101))
           (check-type n strange-range))

Die letzte löst den Debugger mit der folgenden Meldung:

The value of N should be of type STRANGE-RANGE.
The value is: 101
   [Condition of type SIMPLE-TYPE-ERROR]

Dies provoziert das gleiche Ergebnis:

CL-USER> (let ((n "something"))
           (check-type n strange-range))

Die Zwänge man diese Art und Weise zu verhängen sind ausdrucksstark, aber sie dienen nicht dem gleichen Zweck, dass die aufwendige Art Systeme von Sprachen wie Haskell oder Scala tun. Während Typdefinitionen der Common Lisp Compiler auszusenden Code entlocken können mehr zugeschnitten und effizient für die Typen der Operanden sind die Beispiele oben eher eine prägnante Art und Weise zu schreiben Laufzeittyp überprüft.

Andere Tipps

Sie können einen Blick auf Sprachen wie Haskell oder sogar Agda . Auch Oleg hat viele große Ressourcen.

Das ist nicht mein Fachgebiet, so ist es Thema aus sein könnte, aber Microsoft Research hat ein Projekt Code-Verträge , die‚eine sprachunabhängige Art und Weise zur Verfügung stellen, um Codierung Annahmen in .NET-Programmen ausdrücken. die Verträge haben die Form von Vorbedingungen, Nachbedingungen und Objekt Invarianten‘ .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top