Pergunta

Quero fazer um metaprogramação em um idioma tipado estaticamente, onde meus programas e meus meta-programas serão digitados. Quero dizer isso em um sentido forte: se meu gerador de programas compilar, quero que o sistema de tipos seja forte o suficiente para que apenas programas de correção de tipo possam ser gerados.

Tanto quanto eu sei, apenas Metaocaml posso fazer isso. (Não, nem modelos de modelos de Haskell nem C ++ se encaixam na conta - veja este papel). Pergunta: Quais outros idiomas/sistemas permitem isso?

EDIT: Até onde eu sei, a metaocaml está morta. Oleg tentei ressuscitá -lo, mas isso ainda está preso a várias versões por trás do próprio Ocaml. Se alguém quer ir com idiomas experimentais (ou seja, ainda mais do que Metaocaml, parece que Ur e muito possivelmente Idris se encaixar na conta. Alguma outra nova entradas para o campo?

Foi útil?

Solução

F# pode fazer isso também Citações de código.

Outras dicas

Para fazer isso, você deve garantir que o sistema de tipo do idioma subjacente seja diretamente homenageado/verificado pelo próprio metaprograma. Por uma questão prática, isso quase força a metaprogramação a estar na linguagem subjacente ... então acho que não estou surpreso por você poder fazer isso no Metaocaml.

A maioria de nós não obtém ferramentas de metaprogramação incorporadas no idioma subjacente (o C ++ é uma exceção, e eu a rejeito e os sistemas baseados em reflexão como sendo muito fracos para realizar transformações arbitrárias).

Um sistema que pode realizar arbitrário Transformações (ou metaprogramas compostas por conjuntos desses) no código é o DMS Software Reengeneering Toolkit. O DMS possui extremidades frontais para muitos Langauges reais, constrói estruturas de dados do compilador ao analisar (incluindo ASTS). DMS fornece Transformações do programa de origem a fonte Isso representa transformações como AST-Rewrits usando a sintaxe da superfície do idioma de destino. Ele atende à sua exigência até um certo grau: se suas regras de transformação estiverem sintaticamente corretas (e elas forem verificadas pelo DMS), o programa transformado será sintaticamente correto. Ele não atende ao seu requisito de correção de tipo, pois os mecanismos de verificação de tipo são implementados fora do idioma de destino. Em diretor, alguém poderia um verificador seguro para aumentar as transformações do programa; Na prática, descobrimos que podemos codificar transformações de maneira confiável o suficiente.

E mesmo se você tiver transformações seguras de tipo, você não tem garantia de semântico Segurança em relação ao seu programa original. Então, você ainda terá que depurar os metaprogramas.

Metaprogramação de tempo de compilação em scala.

Our flavor of macros is reminiscent of Lisp macros, adapted to incorporate type safety and rich syntax. Unlike infamous C/C++ preprocessor macros, Scala macros: 1) are written in full-fledged Scala, 2) work with expression trees, not with raw strings, 3) cannot change syntax of Scala.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top