Domanda

So che questo può suonare come una bestemmia per gli appassionati Lisp (e altri amanti di linguaggi dinamici), ma quanto difficile sarebbe per migliorare il compilatore Clojure al supporto statico (in fase di compilazione) Tipo di controllo?

Mettendo da parte gli argomenti a favore e contro statica e tipizzazione dinamica, è possibile questo (non "è questo consigliabile")?

stavo pensando che l'aggiunta di una nuova macro lettore a forzare un tipo in fase di compilazione (una versione migliorata del # ^ macro) e aggiungendo le informazioni sul tipo di tabella dei simboli permetterebbe al compilatore di luoghi di bandiera dove un variabili è stata impropriamente . Ad esempio, nel codice seguente, mi aspetterei un errore di compilazione (# * è il "tempo di compilazione" di tipo macro):

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

Il # ^ macro potrebbe anche essere riutilizzato con una variabile globale (*compile-time-type-checking*) per forzare il compilatore del fare i controlli.

Ogni pensiero sulla fattibilità?

È stato utile?

Soluzione

E 'certamente possibile. Il compilatore fa già qualche tipo statico, verifica tipi di argomenti intorno primitivi nel ramo 1.3 sviluppo.

Altri suggerimenti

E 'certo possibile. Tuttavia non credo che Clojure potrà mai ottenere qualsiasi forma di tipizzazione statica deboli. - E 'benefici sono troppo pochi

Rich Hickey ha comunque espresso in più occasioni la sua, come per la funzione tipizzazione forte, optional, ed espressivo del linguaggio Qi, http://www.lambdassociates.org/qilisp.htm

alt text

Sì! Sembra che ci sia un progetto in corso, core.typed, per rendere tipo statico optional il controllo di una realtà. Vedere la Github progetto e la sua documentazione

Questo lavoro nasce da una tesi di laurea onori (PDF) di Ambrose Bonnaire-sergente, ed è relativo al sistema di tipizzati Racket .

Dal momento che una forma viene letta e valutata in un momento non si può avere riferimenti in avanti rendendo questo un po 'limitata.

vecchia questione, ma due punti importanti: non credo Clojure macro Reader supporta, solo le macro Lisp ordinarie. E ora abbiamo l'opzione core.typed per digitare Clojure.

declare può avere tipo suggerimenti, quindi è possibile dichiarare una var che "è" il tipo che non è stata ancora definita, ma contiene i dati sulla struttura, ma questo sarebbe davvero goffo e si avrebbe dovuto farlo prima qualsiasi percorso di codice che potrebbe essere eseguito prima che il tipo è definito. In sostanza, si vorrebbe definire tutti i tipi di utenti definiti in anticipo e poi usarli come normale. Penso che rende libreria iscritto un po 'hacker.

Non volevo suggerire in precedenza che questo non è possibile, solo che per i tipi definiti dall'utente è molto più complicato che per i tipi predefiniti. Il vantaggio di fare questo contro il costo è qualcosa che dovrebbe essere presa seriamente in considerazione. Ma Incoraggio chiunque sia interessato a provarlo e vedere se possono farlo funzionare!

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