2010-06-18 12 views
16

¿Puede nombrar idiomas con verificación de tipo estático (como Java) y donde el código es datos (como en LISP)? Me refiero a ambas cosas en un idioma.¿Conoces un idioma con comprobación de tipo estático donde el código es datos?

+1

Tiendo a estar de acuerdo con las respuestas a esta pregunta: http://stackoverflow.com/questions/2953141/why-are-most-s-expression-languages-dynamically -typed que simplemente no es posible tener ambos. –

+3

@Daniel: solo la respuesta más baja a esa pregunta afirma que no es posible tener ambas. Lo hace afirmando que escribir sería muy difícil. Difícil, sí, pero no imposible. –

+0

Esto es muy similar a http://stackoverflow.com/questions/3037643/typed-metaprogramming-languages ​​ –

Respuesta

0

Si usted está buscando simplemente la capacidad de ejecutar código de forma dinámica en un lenguaje de tipos estáticos, entonces sí Java puede hacer eso:

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

Si necesita más que eso (desea 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).

4

F # tiene Quotation expressions. 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 estos están disponibles en C#, pero (1) No sé lo que la sintaxis es (2) las estructuras de datos son diferentes.

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

Descargo de responsabilidad: Realmente no he usado cualquiera de estos. Hasta donde yo sé, todos son mucho más complicados que el quote de Lisp.

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

+2

Las macros no son 'tiempo de compilación'. Las macros funcionan perfectamente en intérpretes de Lisp. Lisp Macros tampoco son 90% sobre demorar la evaluación. Las macros tienen muchos propósitos. La mayoría no tiene nada que ver con retrasar la evaluación. –

+0

La evaluación de macros ocurre en 'tiempo de lectura' en Common Lisp y Scheme (por lo que recuerdo). No sabía si el solicitante reconocería el término, así que usé uno menos preciso pero más común. Ha habido Lisps experimentales con macros de primera clase, pero no están muy extendidos. En cuanto a retrasar la evaluación, eso es precisamente para lo que 'quote 'es, y qué cierres le dan también, aunque de manera menos conveniente. No estaba hablando solo de macros, ya que son un uso restringido de código como datos. –

+3

Nathan, la evaluación de macros no ocurre en el "tiempo de lectura" en Common Lisp. No un poco. La expansión de macro ocurre durante la interpretación y/o compilación y se describe en el estándar CL. Si se ejecuta el código interpretado, las macros se pueden expandir durante la interpretación. QUOTE tampoco es para retrasar la evaluación como 'cierres'. QUOTE está ahí para denotar datos literales. El código entre comillas no se retrasa, por lo que puede ser 'forzado'. Si uno quiere ejecutar el código entrecomillado, entonces tiene que ser evacuado. Esa es una gran diferencia. –

14

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

Java tiene capacidades muy limitadas de este tipo.

La pregunta interesante no es tanto si puede tener metaprogramming y tipos estáticos, es si puede ser tiene dinámica metaprogramming estáticamente de tipo seguro.

No es Plantilla Haskell, que hace metaprogramming y es de tipo seguro, pero es estática metaprogramming.

Por el momento no puedo pensar en ningún lenguaje que conozca de hecho, permite la metaprogramación dinámica y donde la metaprogramación dinámica es estáticamente segura. Puede que Qi sea astuto para hacerlo, pero no estoy seguro.

+1

¿Puedo solicitar una aclaración de los términos? No estoy seguro de entender tu punto como es. ¿Qué quiere decir con metaprogramación dinámica frente a estática? ¿Está la metaprogramación estática "en tiempo de compilación", es decir, macros, vs dinámica, "en tiempo de ejecución", es decir, cita de expresiones arbitrarias? –

4

Template Haskell está tipado estáticamente pero le permite manipular código como datos, también conocido como metaprogramación. Los idiomas relacionados incluyen MetaML y MetaOCAMl. Busque el trabajo de Tim Sheard.

+2

MetaML y MetaOCaml son bastante diferentes a TH: los primeros son de doble tipado (los generadores tipeados garantizan generar código solo) mientras que TH solo tiene tipeo individual, es decir, solo los resultados de la expansión de la plantilla son verificados por tipo. –

+0

@Jacques buen punto, pero siguen siendo lo suficientemente similares que estoy dispuesto a ponerlos en la misma respuesta :-) –

11

Racket (anteriormente PLT Scheme) tiene un statically typed dialect, que está diseñado para funcionar muy bien con las expresiones idiomáticas de Scheme, incluidas las macros. (Funciona según el tipo de comprobación de los resultados de expansión.)

0

Tal Strongtalk o Zero cuales son sistema reflectante a la Smalltalk, pero se escriben de forma estática.

Cuestiones relacionadas