Existe uma linguagem de programação na qual você pode definir suas próprias configurações de sintaxe e converter o código em um idioma que você escolher?
Por exemplo, você escolheria configurações específicas como "blocos indexados do Python", [a,b,c]
inicializa matrizes ^
para exponenciação e outras. Um script o converteria para o equivalente do idioma de sua escolha.
programming-languages
syntax
Dokkat
fonte
fonte
Respostas:
Sim, mas provavelmente não da maneira que você está pensando.
O Lisp e seus parentes têm poderosos sistemas de macros que permitem realizar transformações arbitrárias em sua fonte; portanto, em princípio, você pode usar macros (e macros de leitor, no nível do caractere) para criar praticamente qualquer extensão que desejar. Idiomas concatenativos (e idiomas de autores em áreas relacionadas) têm potencial para um poder metaprogramador semelhante . Um bom exemplo disso é Forth , no qual muitas construções sintáticas (como comentários) podem ser definidas pelo usuário. Para um exemplo contemporâneo e não esotérico, há um esforço para oferecer ao Perl 6 suporte aprimorado sobre o Perl 5 para sintaxe definida pelo usuário .
fonte
operator[]
vários argumentos ou introduzindo novos operadores como em Haskell; mas duvido que o comitê veja além das questões de análise.Parece programação de conceitos .
Eu não estou familiarizado com isso, mas XL é uma linguagem projetada especificamente para ele.
Lisp e Forth também suportam programação de conceito, embora menor que XL. Sugiro Lisp, pois é muito prático e eficaz. O mais importante é uma sintaxe clara e flexível, e não uma notação, que o Lisp fornece.
Você pode estar interessado em um idioma como Haskell, que possui uma sintaxe muito flexível e uniforme.
fonte
Não que eu saiba.
Também não acho que seria uma idéia particularmente boa - um dos principais benefícios de uma sintaxe de linguagem padrão é que muitas pessoas podem lê-la e, se todos inventarem sua própria sintaxe, ninguém seria capaz de entender o código de outra pessoa. ... então essa linguagem pode ser divertida para um hobby, mas não muito útil para qualquer coisa prática.
O mais próximo que existe provavelmente seria o Lisp, onde o sistema de macros permite que você escreva suas próprias construções de linguagem de uma maneira muito flexível. Normalmente você continuaria com a sintaxe do Lisp, mas poderá redefinir efetivamente tudo se realmente quiser.
Como resultado, os Lisps tendem a ser particularmente populares na implementação de DSLs. Um bom exemplo é esse DSL de acesso a dados em Clojure (Korma), que cuida de todo o código padrão necessário para o acesso ao banco de dados.
fonte
O Scala é frequentemente usado dessa maneira para criar DSLs, idiomas específicos do domínio.
Principalmente porque o Scala não possui operadores, e o método de chamada Scala, sintaxe, pode ser abreviado. Por exemplo:
5 é um objeto inteiro. Para calcular 5 mais 7, você poderia escrever
val ans = 5.add (7), exceto que o método de adição é realmente chamado "+", então você escreveria:
val ans = 5. + (7) mas em Scala, você não precisa incluir o "." em chamadas de método ou entre parênteses "()" em torno de argumentos, para chamar o método + no objeto 5, você escreveria
val ans = 5 + 7, que funciona perfeitamente porque o Scala não tem operadores para interferir no seu esquema inteligente de nomenclatura de métodos. Agora estenda essa idéia para suas próprias classes e objetos, incluindo o fato de que você pode "substituir" métodos como +, bem como criar seus próprios métodos chamados >>> ou ::! ou @ * @ ou apenas nomes de texto sem formatação, como fancify.
fonte
Não estou dizendo que você deve usá-lo, pois ainda é principalmente experimental, mas um paradigma de programação recente interessante é a Linguistic Oriented Programming (LOP).
Sergey Dmitriev explica mais detalhadamente .
Essa é a ideologia disso, mas praticamente tudo se resume ao fato de apoiar o comportamento que você está pedindo. Você pode:
O ambiente de programação mais ativo que conheço de seguir esse paradigma é o Meta Programming System (MPS) gratuito da JetBrains.
Na verdade, ele também está começando a ser usado em software comercial, então talvez esteja começando a sair da fase 'experimental':
fonte
Os idiomas específicos do domínio são comumente usados na comunidade Tcl. Por exemplo, não é incomum ver um programa Tcl que contém DSLs C e SQL como DSLs incorporados (por meio dos pacotes Critcl e Sqlite). A única restrição sobre uma DSL incorporada é que é muito melhor se a linguagem incorporada equilibrar suas chaves, e isso acaba sendo um requisito realmente não oneroso na prática!
Outro idioma que facilita as DSLs é o ML padrão, que permite acessar tokens brutos a partir do tokenizer genérico do sistema (antes do ponto em que os identificadores são convertidos em palavras-chave). Isso facilita a criação de uma ampla classe de DSLs - desde que obedeçam a algumas das regras básicas de sintaxe do SML, especialmente em relação a comentários, cadeias de caracteres e limites de token - e é de fato usado intensamente em vários dos principais aplicativos direcionadores do idioma (provadores de teoremas, etc.)
Nem todos os idiomas tornam isso tão fácil. Em particular, os idiomas que analisam automaticamente o conteúdo dos termos entre colchetes (muitos deles!) Não podem fazer isso, por isso exigem que o DSL seja construído pelos operadores que substituem, colocando o sub-idioma dentro de uma string ou pelo uso de um pré-processador que reescreve o DSL em algo que pode ser tratado dentro do idioma do host.
fonte
AFAIU, você está procurando idiomas que podem ajudá-lo a escrever seu próprio DSL (Domain Specific Language). Existem muitos bons candidatos. Pessoalmente, eu recomendaria Ruby ou Io, porque eles oferecem 1) sobrecarga fácil do operador, 2) metaprogramação e 3) mecanismos de fallback como
method_missing
esse que você pode usar para criar sua própria API. Por exemplo, dê uma olhada no sqldsl , um DSL escrito em Ruby que gera SQL lendo o código Ruby.fonte
Na verdade, eu não o usei em si, mas se bem me lembro, o TXL foi projetado especificamente para traduzir o código-fonte. Como tal, você poderá usá-lo para especificar como traduzir do seu idioma e / ou extensões de idiomas para qualquer idioma real de destino.
Parece ter uma gramática disponível para Javascript. Mas, como não o usei antes, não sei exatamente como isso o ajudaria.
fonte
Existe um bom pré-processador por aí chamado PPWizard, bastante poderoso. Depois de aprender sua sintaxe, você poderá criar padrões de macro para segmentar idiomas diferentes - não que isso seja infalível ou divertido, mas é uma ferramenta útil.
fonte
Pode ser o que você está procurando como compilador. Um compilador compilador pega uma definição de linguagem escrita em uma linguagem formal e cria um compilador para essa linguagem.
Dê uma olhada em http://en.wikipedia.org/wiki/Compiler-compiler
fonte
Uma maneira comum de personalizar parcialmente uma linguagem de programação é usar um pré-processador de macro. Por exemplo, você pode executar "dokkat-lang" no pré-processador C antes de colocar o resultado em que algum ambiente javascript o baixe.
Quanto você pode fazer depende da sofisticação do seu pré-processador. Observe que as versões anteriores do C ++, do Objective C e de várias linguagens experimentais foram feitas pré-processando o código-fonte antes de alimentar uma cadeia de ferramentas do compilador C padrão.
fonte