metacontext

MetaProgramming com gerentes de contexto
Baixe Agora

metacontext Classificação e resumo

Propaganda

  • Rating:
  • Licença:
  • BSD License
  • Preço:
  • FREE
  • Nome do editor:
  • Marko Mikulicic
  • Site do editor:

metacontext Tag


metacontext Descrição

Sempre foi possível escrever idiomas específicos de domínio no Python, mas é uma sintaxe rígida, a falta de smalltalk como "blocos" (ou pelo menos fechamentos anônimos que podem conter declarações) dificultam, se não impossível, para projetar DSL DSL.Metacontext é uma biblioteca Python que fornece um poderoso mecanismo de extensão linguística que tenta seguir os princípios de design de linguagem Python e evitar a criação de construções de sintaxe confusantes que irão quebrar compatibilidades com extensões do editor, como o Emacs Flymake.com Metacontext você pode definir macros que podem manipular a AST É corpo e injetar código abitrinário.Exampleimagine você quer construir uma construção de correspondência de padrões. Sem metacontext você poderia projetar o DSL como este: com padrão_match (msg) como caso: @case (('alguma coisa', qualquer)) def _ (valor): do_something_with (valor) @case (('erro', qualquer)) def _ (E): handle_error (e) O Gerenciador de Contexto Padrão_Match pode verificar se pelo menos um caso foi executado e levantando uma exceção de nomeatch em contrário. No entanto, esse DSL tem dois problemas: 1. É mais detalhado do que o necessário2. Requer que os bangeres sejam contidos em fechamentos que não possam sair de loops, executar (não local) retornos, rendimento de um gerador etc.with metacontext Você pode definir o DSL como: com Pattern_Match (MSG): com caso (( 'Algo', qualquer outro)) como valor: do_something_with (valor) com caso ((«erro», qualquer)) como e: handle_error (e) esta construção permitirá que você interagre bem com coroutines baseados em gerador (como chullbacks inline torcidos) : Com Pattern_Match (MSG): com caso (('algo', qualquer)) como valor: res = rendimento do_somethething_ewith (valor) do_something_ele (res) com o caso (('erro', qualquer)) como E: handle_error (e) Ou execute retornos: com padrão_match (msg): com caso (('algo', qualquer)) como valor: res = do_somethethethething_with (valor) se is_it_the_correct_one (res): retornar com o caso (qualquer): o caso de uso possível é retirado corpo em caso de exceções: com repetição (ioexception): do_something () do_something_elese () que teria sido escrito como: enquanto verdadeiro: tente: do_something () do_something_elese () Exce PT IOException: Passe mais: Breakhow para criar o seu próprio contexto Meta MangersJust Criar uma palavra-chave subclasse: classe de repetição (palavra-chave): def __init __ (auto, * excs): self.excipations = excs def transform (auto, tradutor, corpo, args, var): # ... retornar um objeto Python transformado # você receberá o órgão do `com o` como usar seu meta contexto mangerif você deseja usar seu meta contexto manjedoura, você primeiro tem que registrar a importação do metacontext gancho: importar metacontextacontext.register_importer_hook () ENTÃO Cada arquivo de origem que importa um símbolo que resolve uma subclasse de palavra-chave será interceptada pelo gancho de importação e é a AST será dada aos bandidos de contexto meta que geralmente transformará o corpo do Declaração: do seu apackage.retrymanger importação de importação # ... com repetição (): # .... Macro Definição LanguSaGemanIuplando a AST diretamente é um processo detalhado e pesado, especialmente porque você tem que se preocupar em preservar as informações originais do número da linha para depurar ePTILHE TRACE PNOTES.METACONTEXT OFERECE UMA DEFINIÇÃO MACRO DEFINIÇÃO QUE VOCÊ PODE USAR Para criar rapidamente seus próprios Meta Context Mangers: A própria definição de macro DSL é construída usando Construções de Metacontext: Repetição de Classe (palavra-chave): def __init __ (auto, * excs): .exceptions = Excs Def modelo (auto, tradutor, corpo, args, var): com citação () como q: enquanto true: tente: unquote_stmts (corpo) exceto ioexception: passar else: Break Return Qthe Metacontext Library vai fazer o melhor para Preserve o número de linha original das instruções desquotadas para que você possa usar suas construções perfeitamente em suas fontes como se fossem python native.Notescurly, já que a biblioteca está em desenvolvimento, os módulos que você deseja transformar com o Metacontext terá que conter esta linha Como a primeira linha de sua fonte: # - Language Time-Time-Time-Context-Manager - # Esta restrição será levantada assim que teremos certeza de que possamos lidar corretamente com toda a homepage da importação Gancho.


metacontext Software Relacionado