2010-06-18 10 views
16

Pouvez-vous nommer des langages avec vérification de type statique (comme Java) et où le code est des données (comme dans LISP)? Je veux dire les deux choses dans une langue.Connaissez-vous une langue avec le type statique vérifiant où le code est des données?

+1

Je serais plutôt d'accord avec les réponses à cette question: http://stackoverflow.com/questions/2953141/why-are-most-s-expression-languages-dynamically-typed qu'il n'est tout simplement pas possible d'avoir tous les deux. –

+3

@Daniel: Seule la réponse la moins bien votée à cette question indique qu'il n'est pas possible d'avoir les deux. Il le fait en prétendant que la dactylographie serait vraiment difficile. Dur, oui, mais pas impossible. –

+0

Ceci est très similaire à http://stackoverflow.com/questions/3037643/typed-metaprogramming-languages ​​ –

Répondre

0

Si vous êtes simplement à la recherche de la capacité d'exécuter dynamiquement le code dans un langage typé statiquement, puis Java lui-même peut faire:

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

Si vous avez besoin plus que cela (voulez classes et méthodes comme des objets de première classe, etc.), alors vous voudrez utiliser quelque chose comme Haskell ou C# (comme mentionné dans d'autres réponses) à la place.

4

F # a Quotation expressions. A partir de la page 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 @> 

Je pense que ceux-ci sont disponibles en C#, mais (1) Je ne sais pas ce que la syntaxe est (2) les structures de données sont différentes.

Ces langues permettent le code sous forme de données au moment de la compilation, comme les macros Lisp:

Avis de non-responsabilité: Je n'ai pas vraiment utilisé d'entre eux. Pour autant que je sache, ils sont tous beaucoup plus compliqués que les quote de Lisp.

Cependant, 90% du « Code des données » à l'aide quote peut être accompli avec la fermeture, car ils retardent l'évaluation aussi. Beaucoup de langues ont une syntaxe pratique pour faire des fermetures (C#, Clojure, Scala et Ruby surtout viennent à l'esprit) et n'ont pas besoin de quote autant. Même dans Scheme, qui est un Lisp définitif, le style dominant favorise les fonctions de passage par rapport aux macros d'écriture.

+2

Les macros ne sont pas des 'temps de compilation'. Les macros fonctionnent parfaitement bien dans les interpréteurs Lisp. Les macros Lisp ne sont pas 90% à retarder l'évaluation. Les macros ont beaucoup de buts. La plupart n'ont rien à voir avec le retard de l'évaluation. –

+0

L'évaluation de la macro se produit à l'heure de lecture dans Common Lisp and Scheme (pour autant que je me souvienne). Je ne savais pas si le demandeur reconnaîtrait le terme, alors j'ai utilisé un terme moins précis mais plus commun. Il y a eu des Lisps expérimentales avec des macros de première classe, mais elles ne sont pas répandues. Pour ce qui est de retarder l'évaluation, c'est précisément ce que «quote» signifie, et ce que les fermetures vous donnent aussi, bien que moins facilement. Je ne parlais pas seulement des macros, car elles sont une utilisation restreinte du code-comme-données. –

+3

Nathan, l'évaluation des macros ne se produit pas à l'heure de lecture en Common Lisp. Pas du tout. L'expansion de macro se produit pendant l'interprétation et/ou la compilation et cela est décrit dans la norme CL. Si le code est interprété, les macros peuvent être développées pendant l'interprétation. QUOTE n'est pas non plus pour retarder l'évaluation comme les «fermetures». QUOTE est là pour indiquer des données littérales. Le code cité n'est pas retardé, de sorte qu'il peut être «forcé». Si l'on veut exécuter du code entre guillemets, il faut l'évauler. C'est une énorme différence. –

14

Qi est un dialecte Lisp statiquement typé. De plus, de nombreux autres dialectes Lisp ont un typage statique (optionnel).

Java lui-même a des capacités très limitées de ce genre.

La question intéressante est pas tant de savoir si vous pouvez avoir metaprogramming et typage statique, il est que vous pouvez avoir dynamique metaprogramming statiquement type sécurisé.

Il est modèle Haskell qui -t metaprogramming et est type sécurisé, mais il est statique métaprogrammation.

Pour le moment je ne peux pas penser à un langage que je connais pour un fait permet la métaprogrammation dynamique et où la métaprogrammation dynamique est de type statique de sécurité. Qi pourrait être en balles pour le faire, mais je ne suis pas sûr.

+1

Puis-je demander une clarification des termes? Je ne suis pas sûr de comprendre votre point tel qu'il est. Qu'entendez-vous par métaprogrammation dynamique ou statique? La métaprogrammation statique est-elle "au moment de la compilation", c'est-à-dire macros, vs dynamiques, "au moment de l'exécution", c'est-à-dire une citation d'expression arbitraire? –

4

Template Haskell est saisi statiquement mais vous permet de manipuler le code en tant que données, alias métaprogrammation. Les langues apparentées incluent MetaML et MetaOCaml. Rechercher le travail de Tim Sheard.

+2

MetaML et MetaOCaml sont tout à fait différents de TH - les premiers sont doublement typés (les générateurs typés garantissent de générer uniquement du code typé) tandis que TH est uniquement typé, c'est-à-dire que seuls les résultats de l'expansion sont vérifiés. –

+0

@Jacques bon point, mais ils sont encore assez similaires que je suis prêt à les mettre dans la même réponse :-) –

11

Racket (anciennement schéma PLT) a un statically typed dialect, qui est conçu pour fonctionner correctement avec les idiomes Scheme - y compris les macros. (Il fonctionne par des résultats type de vérification de l'expansion.)

0

Peut-être Strongtalk ou Zero qui sont le système réfléchissant à la Smalltalk, mais sont statiquement typé.

Questions connexes