Suporte de macro em f#
-
01-07-2019 - |
Pergunta
Depois de ler o PRÁTICO COMUM LISP, finalmente entendi qual era o grande problema de Macros, e tenho procurado um idioma para a plataforma .NET que suporta isso. Existem alguns dialetos Lisp para .NET, mas pelo que pude reunir, todos são muito beta ou abandonados. Recentemente, meu interesse foi desencadeado pelo Clojure, mas é para a plataforma Java e, embora provavelmente possa usar o IKVM, não parece integrado. Especialmente quando você quer fazer coisas como o WPF.
Recentemente, ouvi Whisper sobre F#, tentei olhar para a documentação se pudesse encontrar algo sobre o suporte a macro, mas não o encontrei. Então alguém sabe?
Obrigado :)
Solução
Bem, F# é baseado em ocaml e ocaml tem um bastante extenso sistema macro. Dadas as semelhanças sintáticas e semânticas de F# e OCAML, você poderá portar o sistema de macro OCAML para f#.
Além de roubar o sistema macro da OCAML, não tenho conhecimento de um sistema de macro enlatado para f#.
Outras dicas
Nemerle, em http://nemerle.org/ , é uma linguagem .NET (também suporta o mono) que suporta muitos dos paradigma de programação funcional enquanto permanece visualmente perto de C#. Possui extenso suporte macro.
Não. Sem macros para f#.
Você já olhou Vaia? Embora o Boo não tenha macros, ele possui um pipeline de compilador aberto, que é uma boa alternativa às macros para metaprogramação sintática.
Editar] Como observado nos comentários, Boo faz tem macros agora.
Mas bons horrores a sintaxe nesses exemplos de ocaml parecem obscuros
Lá você está encontrando o mesmo trade-off sintático fundamental que você faz com o LISP. Se você deseja o poder das macros do tipo Lisp, você tende a acabar com a sintaxe do tipo Lisp para o idioma, ou então sua sintaxe macro parece bem diferente da sua sintaxe comum ... nada de errado com qualquer abordagem, apenas opções diferentes
Eu pensei que deveria ressaltar que agora existe uma porta .NET/mono de Clojure. Clojure suporta macros de estilo Lisp, como é observado na questão.
Como outros disseram, as macros não são suportadas em F# neste momento (final de 2010).
Recentemente, ouvi Whisper sobre F#, tentei olhar para a documentação se pudesse encontrar algo sobre o suporte a macro, mas não o encontrei. Então alguém sabe?
F# não suporta macros e é improvável que nunca o fará.
Que tal usar as citações F#?
Isso pode ser o contrário do que você quer, mas você sabe sobre Rdnzl? É uma interface Foerign-Função (FFI) que permite ligar para as bibliotecas .NET do seu código LISP.
Provavelmente são muito menos maduros do que qualquer implementação comum de Lisp ou esquema, mas existem dialetos Lisp para .NET: EU# e Dotlisp.
Existem dois Lisps desenvolvidos ativamente para .NET
Ironscheme - Implementação do esquema baseado em DLR
Xronos - Porta de clojure baseada em DLR
Atualmente, estou investigando possibilidades de metaprogramação em F#. Se definirmos macros como modelo de texto que se expande em código, há duas abordagens óbvias:
Modelos T4. Há implementação para f#: https://github.com/kerams/templatus
Vi um lugar para invocação de f# de strings em montagem separada e depois carregar a montagem.