world versiones programming programa precursor hello estructura descripcion creator compiladores common programming-languages lisp static-typing s-expression

programming languages - versiones - ¿Conoce un idioma con la comprobación de tipo estático donde el código es datos?



programming in lisp (6)

F # tiene expresiones de cotización . Desde la página de MSDN:

// typed let e : Expr<int> = <@ 1 + 1 @> // untyped let e'' : Expr = <@@ 1 + 1 @@> // splicing with % // similar to Lisp''s unquote-splicing, but type-checked: // you can only splice expressions of the appropriate type <@ 1 + %e @>

Creo que están disponibles en C #, pero (1) no sé cuál es la sintaxis (2) las estructuras de datos son diferentes.

Estos lenguajes permiten el código como datos en tiempo de compilación, como las macros de Lisp:

Descargo de responsabilidad: Realmente no he usado ninguno de estos. Que yo sepa, todos son mucho más complicados que la quote de Lisp.

Sin embargo, el 90% de "Código como datos" utilizando la quote se puede lograr con cierres, ya que también retrasan la evaluación. Muchos idiomas tienen una sintaxis conveniente para hacer cierres (C #, Clojure, Scala y Ruby vienen especialmente a la mente) y no es necesario quote demasiado. Incluso en Esquema, que es un Lisp definitivo, el estilo prevaleciente favorece las funciones de paso sobre las macros de escritura.

¿Puede nombrar idiomas con la verificación de tipos estática (como Java) y donde el código es datos (como en LISP)? Me refiero a las dos cosas en un solo idioma.


Qi es un dialecto Lisp de tipo estático. Además, muchos otros dialectos Lisp tienen (opcional) escritura estática.

Java en sí tiene capacidades muy limitadas de este tipo.

La pregunta interesante no es si puede tener metaprogramación y escritura estática, es si puede tener metaprogramación dinámica estáticamente segura para el tipo .

Hay una plantilla de Haskell que hace metaprogramación y es de tipo seguro, pero es metaprogramación estática .

Por el momento, no puedo pensar en ningún lenguaje que yo sepa que permite la metaprogramación dinámica y donde la metaprogramación dinámica es estáticamente segura. Qi podría ser una bala para hacerlo, pero no estoy seguro.


Si simplemente está buscando la capacidad de ejecutar código dinámicamente en un lenguaje de tipo estático, entonces Java puede hacerlo:

http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html

Si necesitas más que eso (quieres métodos y clases como objetos de primera clase, etc.), entonces querrás usar algo como Haskell o C # (como se menciona en otras respuestas).


Tal vez Strongtalk o Zero que son un sistema reflexivo como Smalltalk, pero están tipificados estáticamente.


Racket (anteriormente PLT Scheme) tiene un dialecto de tipo estático , que está diseñado para funcionar bien con los modismos Scheme, incluidas las macros. (Funciona comprobando los resultados de la expansión).


La plantilla Haskell se escribe de forma estática pero le permite manipular el código como datos, también conocido como metaprogramación . Los idiomas relacionados incluyen MetaML y MetaOCaml. Busca el trabajo de Tim Sheard.