Pour ce faire, vous devez vous assurer que le système de types de la langue sous-jacente est directement honoré/vérifié par le métaprogramme lui-même.En pratique, cela force presque la métaprogrammation à être dans le langage sous-jacent ... donc je suppose Je ne suis pas surpris que vous pourriez être en mesure de le faire en métaocaml
La plupart d'entre nous ne comprennent pas d'outils de métaprogrammation au langage sous-jacent (C++ étant plutôt une exception, et je la rejette et les systèmes basés sur la réflexion comme étant trop faibles pour effectuer des transformations arbitraires).
Un système pouvant effectuer des transformations arbitraires (ou des métaprogrammes composés d'ensembles de ceux-ci) sur le code est le DMS Software Reengineering Toolkit. DMS a des frontaux pour de nombreuses langues réelles, construit des structures de données de compilateur lors de l'analyse (y compris les AST). DMS fournit source-to-source program transformations qui représentent les transformations en tant que réécritures AST en utilisant la syntaxe de surface du langage cible. Il répond à vos exigences dans une certaine mesure: si vos règles de transformation sont syntaxiquement correctes (et vérifiées par DMS), alors le programme transformé sera syntaxiquement correct. Il n'atteint pas votre exigence de correction de type, car les mécanismes de vérification de type sont implémentés en dehors de la langue cible. En principe, on pourrait utiliser un vérificateur de type pour augmenter les transformations du programme; En pratique, nous avons constaté que nous pouvions coder les transformations de manière fiable.
Et même si vous avez des transformations de type sécurité, vous n'avez pas une garantie de sécurité sémantique par rapport à votre programme d'origine. Donc, vous devrez toujours déboguer les métaprogrammes.
Y at-il une question? – Ken
@Ken: oui - donnez-moi des langues/systèmes qui permettent cela. Je vais éditer la question (bien que je vois que 2 répondeurs m'ont parfaitement bien compris). –
J'avais l'intention de remarquer, concernant TH, que [ce sujet est apparu sur la liste de diffusion Haskell-café] (http://www.haskell.org/pipermail/haskell-cafe/2010-April/075753.html) un peu alors que de retour, mais après avoir trouvé le fil, il semble que, pour des raisons évidentes, il ne fournit aucune aide pour répondre à cette question ... –