Domanda

Questo è un follow-up a mio precedente domanda sulla tipizzazione statica Clojure.

ho passato in rassegna il codice sorgente Java per il compilatore e ci sono molti posti in cui si verifica il valore di *warn-on-reflection*, ma quando compilo il seguente codice, ho solo un errore di run-time:

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

Ci sono circostanze in cui questo codice dovrebbe non dare un avvertimento in fase di compilazione (non)? Come sarebbe difficile avere il compilatore dare un avviso sul seguente codice:

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

Grazie.

È stato utile?

Soluzione

Il problema è che il compilatore non tiene traccia del tipo di Vars def'd. Quindi sì, nel vostro semplice esempio, sarebbe possibile. Ma come spesso si passa un letterale? Raramente, in un programma vero e proprio.

Fare tipi "flusso attraverso" come fanno in un vero linguaggio a tipizzazione statica richiederebbe una vasta quantità di rielaborazione. Dovreste tenere traccia delle informazioni di tipo attraverso Vars, in modo dinamico rimbalzo Vars, dereferenziazioni, ecc E poi si ancora avere il problema di tirare oggetti di collezioni / sequenze, che implica genericized tipi, che è un enorme vaso di Pandora ...

annotazioni di tipo a Clojure sono mai stati destinati a fornire il tipo di sicurezza in fase di compilazione - (. A scapito di un errore di run-time se si verifica un tipo inaspettato) hanno appena permettono al compilatore di generare codice più ottimizzato

Instrumentazione al compilatore informazioni tipizzazione statica completa potrebbe essere possibile, ma a quel punto hai in gran parte riscritto la lingua, e ti hanno dovuto prendere molte decisioni e compromessi nel modo in cui vengono gestiti i tipi. In realtà non sarebbe più Clojure.

Altri suggerimenti

Invece di cercare di modificare il compilatore, perché non scrivere uno strumento separato che solo la scansione di un file di codice Clojure e mette in guardia circa le violazioni di tipo? Si potrebbe sviluppare il proprio tipo di notazione utilizzando macro che solo collassare in normale codice Clojure non tipizzato. Ma quando si esegue il tipo statico checker, sarebbe Grok i tipi e le avvertenze di output.

Se tu fossi in su per una sfida leggermente più grande, si potrebbe anche averlo effettuare inferenza di tipo riducendo così l'onere della notazione.

In seguito quel filo, v'è ora un progetto allo scopo di far digitando graduale in clojure (come Dart, ecc). Vale la pena provarla: digitato Clojure

Se qualcuno può anche dare un feedback dopo l'uso vero e proprio ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top