Mecanografía estática clojure
static-typing (6)
¡Sí! Parece que hay un proyecto en curso, core.typed
, para hacer que la comprobación de tipos estática opcional sea una realidad. Ver el proyecto Github y su documentation
Este trabajo surgió de una tesis de licenciatura (PDF) de Ambrose Bonnaire-Sergeant, y está relacionado con el sistema Typed Racket .
Sé que esto puede sonar como una blasfemia para los aficionados de Lisp (y otros amantes de los lenguajes dinámicos), pero ¿qué tan difícil sería mejorar el compilador de Clojure para admitir la verificación de tipos estática (tiempo de compilación)?
Dejando a un lado los argumentos a favor y en contra de la escritura estática y dinámica, ¿es esto posible (no "es esto aconsejable")?
Pensaba que agregar una nueva macro de lector para forzar un tipo de tiempo de compilación (una versión mejorada de la macro # ^) y agregar la información de tipo a la tabla de símbolos permitiría al compilador marcar los lugares donde se usaba mal una variable. Por ejemplo, en el siguiente código, esperaría un error de tiempo de compilación (# * es la macro de tipo "tiempo de compilación"):
(defn get-length [#*String s] (.length s))
(defn test-get-length [] (get-length 2.0))
La macro # ^ podría incluso ser reutilizada con una variable global ( *compile-time-type-checking*
) para forzar al compilador a hacer las verificaciones.
¿Alguna idea sobre la viabilidad?
Antigua pregunta, pero dos puntos importantes: no creo que Clojure admita macros de lectura, solo macros ordinarias. Y ahora tenemos la opción core.typed para escribir en Clojure.
Ciertamente es posible. El compilador ya realiza una comprobación de tipos estática en torno a los tipos de argumentos primitivos en la rama de desarrollo 1.3.
Dado que una forma se lee y evalúa a la vez, no puede haber referencias hacia adelante, lo que hace que esto sea algo limitado.
Es cierto posible. Sin embargo, no creo que Clojure obtenga alguna forma de escritura estática débil; sus beneficios son muy pocos.
Sin embargo, Rich Hickey ha expresado en varias ocasiones su gusto por la característica de escritura fuerte, opcional y expresiva del lenguaje Qi, http://www.lambdassociates.org/qilisp.htm
declare puede tener sugerencias de tipo, por lo que es posible declarar una var que "es" el tipo que aún no se ha definido pero que contiene datos sobre la estructura, pero esto sería realmente torpe y tendría que hacerlo antes de cualquier ruta de código que podría ejecutarse antes de que se defina el tipo. Básicamente, desearía definir todos los tipos definidos por el usuario por adelantado y luego usarlos como de costumbre. Creo que eso hace que la escritura de la biblioteca sea un poco pirata.
No quise sugerir antes que esto no es posible, solo que para los tipos definidos por el usuario es mucho más complicado que para los tipos predefinidos. El beneficio de hacer esto frente al costo es algo que se debe considerar seriamente. ¡Pero animo a cualquiera que esté interesado a probarlo y ver si pueden hacerlo funcionar!