Boa informações sobre sistemas do tipo com base em contratos / restrições?
-
19-09-2019 - |
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.
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
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' .