Clojure typage statique, partie 2
-
25-09-2019 - |
Question
Ceci est un suivi de href="https://stackoverflow.com/questions/4184665/clojure-static-typing"> sur le typage statique Clojure.
Je le code parcouru source Java pour le compilateur et il y a plusieurs endroits où il vérifie la valeur de *warn-on-reflection*
, mais quand je compile le code suivant, je ne reçois que d'une erreur d'exécution:
(defn div-2 [^String s] (/ 2 s))
Y a-t-il des circonstances dans lesquelles ce code devrait pas donner un avertissement à la compilation (il ne fonctionne pas)? Comment serait-il difficile d'avoir le compilateur donne un avertissement sur le code suivant:
(defn get-length [^String s] (.length s))
(defn test-get-length [] (get-length 2.0))
Merci.
La solution
Le problème est que le compilateur ne suit pas le type de vars def
'd. Alors oui, dans votre exemple simple, il serait possible. Mais à quelle fréquence vous passez un littéral? Rarement, dans un véritable programme.
Faire des types « écoulement à travers » comme ils le font dans une langue réelle typé statiquement nécessiterait une grande quantité de remaniement. Il faudrait suivre les informations de type par vars, rebond dynamique vars, déréférencement, etc. Et puis vous toujours ont la question de tirer des articles de collections / séquences, ce qui implique des types genericized, ce qui est énorme de vers ... peut
Type annotations dans Clojure ont jamais été destinées à fournir de type sécurité au moment de la compilation - (. Au détriment d'une erreur d'exécution de temps si un type inattendu est rencontré) ils ne permettent au compilateur de générer un code plus optimisé
le compilateur avec instrumentation d'informations de typage statique complète pourrait être possible, mais à ce moment-là que vous avez largement réécrit la langue, et vous aurez dû prendre de nombreuses décisions et des compromis dans la façon dont les types sont traités. Il ne serait vraiment pas Clojure plus.
Autres conseils
Plutôt que d'essayer de modifier le compilateur, pourquoi ne pas écrire un outil distinct qui vient scanne un fichier de code Clojure et met en garde contre les violations de type? Vous pouvez développer votre propre notation de type en utilisant des macros qui s'effondrent juste dans le code typées normale Clojure. Mais lorsque vous exécutez le vérificateur de type statique, il assimilez les types et les avertissements de sortie.
Si vous étiez à relever un défi un peu plus, vous pouvez même l'avoir effectuer l'inférence de type réduisant ainsi la charge de la notation.
Faisant suite ce fil, il y a maintenant un projet visant à mettre en tapant progressive clojure (comme Dart, etc.). A tester, il: dactylographié-Clojure
Si quelqu'un peut également donner quelques commentaires après l'utilisation réelle ...