Question

Problème:

Je cherche une bonne introduction sur systèmes de type , qui sont basées sur contrats / contraintes (désolé, je ne me souviens pas ce terme est le plus approprié pour un système de type) .

Je dois cette information pour être en mesure de mettre en œuvre un système de type expérimental de ce genre.

Pour autant que je sache, ce système de type est utilisé dans XSD (Xml Schema Definition).

Au lieu de définir un type de données, on définit des contraintes sur l'ensemble de valeurs possibles.

Exemple:

Je définis une méthode avec un paramètre, qui est soit "nothing", ou correspond à la gamme intégrale [0..100].

Cette méthode accepterait les valeurs suivantes:

"nothing"
0
1
...
100

Je l'espère, je pourrais faire mon auto clair.

Était-ce utile?

La solution

Common Lisp offre des tests tels type à temps d'exécution . Il dispose d'un système de type complexe, mais il ne sert pas que vous pourriez être habitué à un statiquement typé. La macro check-type accepte TypeSpec , qui peut être une spécification intégré ou celui défini par la macro deftype . Les contraintes exprimables avec typespecs sont celles d'une fonction sous-jacente écrite dans la langue d'accueil, ce qui est de dire que tout ce que vous pouvez inspectent un temps d'exécution peut être les critères pour ce qui constitue votre nouveau type.

Prenons cet exemple:

(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)))

qui définit un type appelé « étrange gamme ». Maintenant, testez quelques valeurs contre:

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))

Le dernier déclenche le débogueur avec le message suivant:

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

Celui-ci provoque le même résultat:

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

Les contraintes, on peut imposer cette façon sont expressifs, mais ils ne servent pas le même but que les systèmes de type élaborés de langues comme Haskell ou Scala font. Bien que les définitions de type peuvent amadouer le compilateur Common Lisp pour émettre un code plus adaptées et efficaces pour les types des opérandes, les exemples ci-dessus plus d'une manière concise d'écrire des chèques de type d'exécution.

Autres conseils

Vous pouvez jeter un oeil à des langues comme Haskell , ou même Agda . En outre, Oleg a beaucoup de grandes ressources.

Ce n'est pas mon domaine d'expertise, de sorte qu'il pourrait être hors sujet, mais Microsoft Research a un projet noreferrer code des marchés , qui « fournissent une manière d'exprimer des hypothèses de codage agnostique des langues dans les programmes .NET. les contrats prennent la forme de conditions préalables, et postconditions invariants objet » .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top