Question

Je sais que cela peut sembler un blasphème pour les amateurs Lisp (et d'autres amateurs de langues dynamiques), mais comment serait-il difficile d'améliorer la vérification de type compilateur Clojure à l'électricité statique de support (compilation)?

Mis à part les arguments pour et contre statique et typage dynamique, est-ce possible (et non « est-ce souhaitable »)?

Je pensais que l'ajout d'une nouvelle macro de lecture pour forcer un type de compilation (une version améliorée du # ^ macro) et en ajoutant les informations de type à la table des symboles permettant au compilateur de lieux de drapeau où une variable a été mal utilisés . Par exemple, dans le code suivant, j'attendre une erreur de compilation (# * est la macro de type « compilation »):

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

Le # ^ macro pourrait même être réutilisé avec une variable globale (*compile-time-type-checking*) pour forcer le compilateur le faire les contrôles.

Toute réflexion sur la faisabilité?

Était-ce utile?

La solution

Il est certainement possible. Le compilateur fait déjà un certain type statique de vérification des types d'arguments autour de primitives dans la branche de développement 1.3.

Autres conseils

Il certaine possible. Cependant, je ne pense pas que Clojure ne pourra jamais obtenir toute forme de typage statique faible -. Avantages de celui-ci sont trop peu

Rich Hickey a cependant exprimé à plusieurs reprises son comme pour les forts, en option, et fonction expressive de frappe de la langue Qi, http://www.lambdassociates.org/qilisp.htm

text alt

Oui! On dirait qu'il ya un projet en cours, core.typed, pour faire de type statique en option vérifier une réalité. Voir le projet Github et son documentation

Ce travail est née d'une thèse de spécialisation de premier cycle (PDF) par Ambroise-sergent Bonnaire et est lié au système de dactylographié Racket.

Comme une forme est lu et évalué à un moment vous ne pouvez pas avoir des références en avant ce qui en fait un peu limité.

question vieux mais deux points importants: Je ne pense pas que Clojure supports macros de lecture, seules les macros Lisp ordinaires. Et maintenant, nous avons l'option core.typed pour taper Clojure.

déclarer peut avoir des notes de type, il est donc possible de déclarer un var que « est » le type qui n'a pas encore été défini, mais contient des données sur la structure, mais ce serait vraiment maladroit et vous auriez à le faire avant tout chemin de code peut être exécutée avant que le type est défini. En gros, vous voulez définir tous vos types définis par l'utilisateur avant et les utiliser comme normal. Je pense que rend l'écriture bibliothèque un peu hackish.

Je ne l'ai pas voulu dire plus tôt que cela est impossible, juste que pour les types définis par l'utilisateur, il est beaucoup plus compliqué que pour les types définis pré. L'avantage de le faire par rapport au coût est quelque chose qui devrait être sérieusement envisagée. Mais j'encourage tous ceux qui sont intéressés à l'essayer et voir si elles peuvent le faire fonctionner!

scroll top