Pregunta

Este es un seguimiento de mi anterior pregunta de tipos estáticos Clojure.

he echado un vistazo al código fuente de Java para el compilador y hay varios lugares donde se comprueba el valor del *warn-on-reflection*, pero cuando compilo el siguiente código, sólo se me sale un error en tiempo de ejecución:

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

¿Hay circunstancias en las que el código debe no dar una advertencia de compilación en tiempo (no)? ¿Qué tan difícil sería para que el compilador emita una advertencia sobre el siguiente código:

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

Gracias.

¿Fue útil?

Solución

El problema es que el compilador no hace un seguimiento del tipo de VARs def'd. Así que sí, en su simple ejemplo, sería posible. Pero ¿con qué frecuencia se pasa un literal? En raras ocasiones, en un programa real.

Hacer tipos "fluya a través de" como lo hacen en un lenguaje real de tipos estáticos requeriría una gran cantidad de reelaboración. Habría que realizar un seguimiento de la información de tipo a través de VARs, dinámica de rebote VARs, desreferencias, etc. Y entonces Todavía tiene el problema de tirar artículos de colecciones / secuencias, lo que implica tipos genericized, que es una enorme caja de los truenos ...

anotaciones Tipo de Clojure nunca tuvieron la intención de proporcionar seguridad de tipos en tiempo de compilación - (., A expensas de un error en tiempo de ejecución si se detecta un tipo inesperado) que sólo permiten el compilador para generar un código más optimizado

Instrumentación el compilador con la información completa tipificación estática podría ser posible, pero en ese momento usted ha reescrito en gran medida el lenguaje, y se le han tenido que tomar muchas decisiones y compensaciones en cómo se manejan los tipos. Realmente no sería Clojure más.

Otros consejos

En lugar de tratar de modificar el compilador, por qué no escribir una herramienta separada que simplemente escanea un archivo de código Clojure y advierte sobre violaciónes tipo? Se podría desarrollar su propio tipo de notación usando macros que acaba de derrumbarse en código Clojure sin tipo normal. Sin embargo, al ejecutar el comprobador de tipo estático, sería asimilar los tipos y las advertencias de salida.

Si se va para un desafío un poco más grande, que podría incluso tener que realizar la inferencia de tipos reduciendo así la carga de la notación.

Siguiendo ese hilo, ahora hay un proyecto destinado a traer la tipificación gradual en clojure (como Dart, etc.). Vale la pena probarlo: Typed-Clojure

Si alguien también puede dar alguna reacción después de un uso real ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top