Pregunta

Problema:

Busco buena introducción acerca de los sistemas Tipo , que se basan en contratos / restricciones
(lo siento, no recuerdo el que un término es apropiado para un sistema de tipos) .

Necesito esa información para poder poner en práctica un sistema de tipo experimental de este tipo.

Por lo que sé, tal tipo de sistema se utiliza en XSD (XML Schema Definition).

En lugar de definir un tipo de datos, uno define las limitaciones en el conjunto de posibles valores.

Ejemplo:

defino algún método con un parámetro, que es ya sea "nothing", o coincide con el [0..100] integral rango.

Tal método sería aceptar valores siguientes:

"nothing"
0
1
...
100

Espero, pude hacer mi auto claro.

¿Fue útil?

Solución

Common Lisp ofrece pruebas de este tipo en el tiempo de ejecución . Tiene un sistema de tipo elaborado, pero no se utiliza como puede que esté acostumbrado a en un lenguaje de tipo estático. El check-type acepta un typespec , que puede ser una especificación incorporado o uno definido por la macro deftype . Las limitaciones que se pueden expresar con typespecs son los de una función de predicado escrito en la lengua de acogida, lo que quiere decir que cualquier cosa que pueda inspeccionar un tiempo de ejecución puede ser el criterio para lo que constituye el nuevo tipo.

Considere este ejemplo:

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

que define un tipo llamado "extraña alcance". Ahora probar unos pocos valores en contra de ella:

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

El último desencadena el depurador con el mensaje siguiente:

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

Éste provoca el mismo resultado:

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

Las restricciones se pueden imponer de esta manera son expresivos, pero no tienen el mismo propósito que los sistemas de tipo elaboradas de lenguajes como Haskell o Scala hacen. Si bien las definiciones de tipo pueden convencer el compilador Common Lisp para emitir código más adaptados a y eficiente para los tipos de los operandos, los ejemplos anteriores son más de una manera concisa de escribir cheques de tipo de tiempo de ejecución.

Otros consejos

Puede echar un vistazo a idiomas como el Haskell , o incluso Agda. Además, Oleg tiene un montón de grandes recursos.

Esto no es mi área de especialización, lo que podría ser fuera de tema, pero Microsoft Research tiene un proyecto noreferrer Code Contracts , que 'proporcionan una manera independiente del idioma para expresar supuestos de codificación de programas .NET. los contratos toman la forma de condiciones previas, condiciones posteriores, e invariantes de objeto' .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top