Pergunta

Este é um acompanhamento para Minha pergunta anterior na digitação estática de clojure.

Eu naveguei no código -fonte Java para o compilador e há vários lugares onde ele verifica o valor de *warn-on-reflection*, mas quando compilar o código a seguir, recebo um erro de tempo de execução:

(defn div-2 [^String s] (/ 2 s))

Há alguma circunstância em que este código deve não Dê um aviso de tempo de compilação (não)? Quão difícil seria que o compilador dê um aviso sobre o seguinte código:

(defn get-length [^String s] (.length s))
(defn test-get-length [] (get-length 2.0))

Obrigado.

Foi útil?

Solução

O problema é que o compilador não rastreia o tipo de def'D Vars. Então, sim, no seu exemplo simples, seria possível. Mas com que frequência você passa por um literal? Raramente, em um programa real.

Fazer os tipos "fluir através", como fazem em um idioma real tipado estaticamente, exigiria uma quantidade extensa de reformulação. Você teria que rastrear informações de tipo através de vars, vars dinamicamente rebote, desreferências etc. e então você ainda ter a questão de retirar itens de coleções/seqüências, o que implica tipos genicizados, que é um enorme lata de minhocas...

As anotações de tipo em Clojure nunca foram destinadas a fornecer-segurança no tempo de compilação-elas apenas permitem que o compilador gere código mais otimizado (às custas de um erro de tempo de execução, se um tipo inesperado for encontrado.))

Instrumentando o compilador com informações completas de digitação estática pode ser possível, mas nesse ponto você reescreveu amplamente o idioma e terá que tomar muitas decisões e trocas de como os tipos são tratados. Realmente não seria mais clojure.

Outras dicas

Em vez de tentar modificar o compilador, por que não escrever uma ferramenta separada que apenas digitalize um arquivo de código de clojure e alerta sobre violações do tipo? Você pode desenvolver sua própria notação de tipo usando macros que apenas colapsam no código de clojure normal. Mas quando você executa o verificador do tipo estático, ele combinava os tipos e os avisos de saída.

Se você estava pronto para um desafio um pouco maior, poderia até que ele execute a inferência de tipo, diminuindo assim o ônus da notação.

Após esse tópico, agora existe um projeto com o objetivo de trazer digitação gradual para Clojure (como dard, etc.). Vale a pena testá -lo:Tiped-clojure

Se alguém também pode dar algum feedback após o uso real ...

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