Pergunta

Problema:

Eu estou procurando uma boa introdução sobre sistemas tipo , que são baseados em contratos / restrições
(desculpe, não me lembro que um termo é apropriado para um sistema tipo) .

Eu preciso que a informação seja capaz de implementar um sistema de tipo experimental desse tipo.

Tanto quanto eu sei, como tipo de sistema é usado na XSD (XML Schema Definition).

Em vez de definir um tipo de dados, define-se restrições no conjunto de valores possíveis.

Exemplo:

defino algum método com um parâmetro, que é ou "nothing", ou coincide com o intervalo [0..100] integrante.

Tal método aceitaria seguintes valores:

"nothing"
0
1
...
100

Eu espero, eu poderia fazer a minha auto clara.

Foi útil?

Solução

ofertas Lisp comum esse tipo de teste em tempo de execução . Tem um sistema do tipo elaborado, mas não é usado como você pode estar acostumado a em uma linguagem estaticamente digitada. A macro check-type aceita um typespec , que pode ser um built-in especificação ou aquele definido pela macro deftype . As restrições exprimíveis com typespecs são aqueles de uma função predicado escrito na língua de acolhimento, o que quer dizer que qualquer coisa que você pode inspecionar um tempo de execução podem ser os critérios para o que constitui o novo tipo.

Veja este exemplo:

(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 um tipo chamado "estranha-range". Agora testar alguns valores contra ele:

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

O último aciona o depurador com a seguinte mensagem:

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

Este provoca o mesmo resultado:

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

As restrições se pode impor desta forma são expressivos, mas eles não têm a mesma finalidade que os sistemas de tipo elaborados de linguagens como Haskell ou Scala fazer. Enquanto definições de tipo pode persuadir o compilador Lisp comum ao código emitem mais adaptados para e eficiente para os tipos dos operandos, os exemplos acima são mais de uma maneira concisa para tipo cheques gravação tempo de execução.

Outras dicas

Você pode ter um olhar para linguagens como Haskell , ou mesmo Agda. Além disso, Oleg tem lotes de grandes recursos.

Esta não é a minha área de especialização, por isso pode ser fora do tópico, mas a Microsoft Research tem um projeto contratos de código , que 'oferecem uma forma de linguagem agnóstico para expressar codificação pressupostos NET programas. os contratos de assumir a forma de pré-condições, pós-condições e invariantes objeto' .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top