unlist every div clojure compiler-errors static-analysis type-safety compilation-time

every - reduce in clojure



Tipo de seguridad en Clojure (3)

Dado que Clojure es un lenguaje dinámico, la idea general es no verificar los tipos (o mucho de todo) en el momento de la compilación.

Incluso cuando agrega sugerencias de tipo a su función, no se verifican en tiempo de compilación.

Como Clojure es un Lisp, puede hacer lo que quiera en tiempo de compilación con macros, y las macros son lo suficientemente potentes como para que pueda escribir sus propios sistemas de tipos. Algunas personas han hecho sistemas tipográficos para lisps Typed Racket y Qi . Estos sistemas de Tipo pueden ser tan poderosos como cualquier sistema de Tipo en un lenguaje "normal".

Ok, ahora sabemos que es posible, pero ¿Clojure tiene un sistema de tipo opcional? Actualmente, la respuesta es no, pero hay un motor lógico (core.logic) que podría usarse para implementar un sistema de tipos, pero el autor no ha trabajado (aún) en esa dirección.

Quiero preguntar qué tipo de construcciones de lenguajes de seguridad de tipo hay en Clojure?

He leído ''Practical Clojure'' de Luke VanderHart y Stuart Sierra varias veces, pero todavía tengo la clara impresión de que Clojure (como otras trampas) no se toma muy en serio la verificación de validación en tiempo de compilación. La seguridad de tipos es solo una estrategia (muy popular) para realizar la compilación en tiempo de compilación de la semántica correcta

Estoy haciendo esta pregunta porque me parece que estoy equivocado; ¿Qué tipo de patrones de diseño están disponibles en clojure para validar (en tiempo de compilación, no en tiempo de ejecución) que una función que espera que una cadena no sea llamada con, por ejemplo, una lista de enteros?

Además, he leído que personas muy inteligentes como Paul Graham abogan abiertamente sobre lisp, lo que permite implementar todo lo que sea más alto desde lenguajes de nivel inferior (la mayoría diría que el lenguaje se está reimplementando encima de él), así que si la afirmación Sería cierto, entonces cosas triviales como la verificación de tipos deberían ser un pedazo de pastel. Entonces, ¿cree que existen sistemas de tipo (o la capacidad de implementar dichos sistemas de tipo) en clojure u otros lisps, que le dan al programador la capacidad de compensar la verificación de validación de tiempo de ejecución a tiempo de compilación, o incluso mejor, el diseño? ¿hora?


Hay una biblioteca que agrega un sistema de tipo opcional a Clojure,

http://typedclojure.org/

Razón fundamental

La tipificación estática tiene beneficios bien conocidos. Por ejemplo, los idiomas escritos de forma estática detectan muchos errores de programación comunes lo antes posible: tiempo de compilación. Los tipos también sirven como una excelente forma de documentación (verificable por la máquina) que casi siempre aumenta la documentación manuscrita existente.

Los idiomas sin verificación de tipos estáticos (tipificados dinámicamente) traen otros beneficios. Sin la rigidez estricta de la tipificación estática obligatoria, pueden proporcionar modismos más flexibles y tolerantes que pueden ayudar en la creación rápida de prototipos. A menudo, los beneficios de la verificación de tipos estáticos se desean a medida que el programa crece.

Este trabajo agrega la verificación de tipos estática (y algunos de sus beneficios) a Clojure, un lenguaje tipificado dinámicamente, a la vez que conserva los modismos que caracterizan el idioma. Permite mezclar código estático y de tipo dinámico para que el programador pueda utilizar el que sea más apropiado.


Las unidades de compilación en Clojure son muy pequeñas, una sola función. Los Lispers tienden a cambiar pequeñas porciones de los programas en ejecución mientras se desarrollan. La introducción de la comprobación de tipos estática en este estilo de desarrollo es problemática; para una discusión más profunda de por qué recomiendo la publicación Los tipos son anti-modulares por Gilad Bracha. Por lo tanto, Clojure prefiere condiciones previas / posteriores que se adaptan mejor al desarrollo altamente orientado a REPL de Lisp.

Dicho esto, es ciertamente deseable y posible construir un sistema de tipo a la carta para Clojure. Este sendero ha sido incendiado por Qi / Shen y Typed Racket. Esta funcionalidad podría proporcionarse fácilmente como una biblioteca. Espero construir algo así en el futuro con core.logic - https://github.com/clojure/core.logic .