Есть ли язык программирования, на котором вы можете установить свои собственные синтаксические конфигурации, и он будет преобразовывать код в язык, который вы выберете?
Например, вы должны выбрать конкретные конфигурации, такие как «индексированные блоки Python», [a,b,c]
инициализировать массивы, ^
для возведения в степень и другие. Скрипт конвертирует его в эквивалент выбранного вами языка.
programming-languages
syntax
Dokkat
источник
источник
Ответы:
Да, но, вероятно, не так, как вы думаете.
Lisp и его родственники имеют мощные макросистемы, которые позволяют вам выполнять произвольные преобразования в вашем источнике, поэтому в принципе вы можете использовать макросы (и макросы читателей на уровне символов) для создания практически любых расширений, которые вам нравятся. Конкатенационные языки (и языки авторов в смежных областях) имеют потенциал для аналогичной способности метапрограммирования . Хорошим примером этого является Forth , в котором множество синтаксических конструкций (таких как комментарии) могут быть определены пользователем. В современном неэзотерическом примере предпринята попытка улучшить Perl 6 по сравнению с Perl 5 для пользовательского синтаксиса .
источник
operator[]
для нескольких аргументов или введения новых операторов, как в Haskell; но я сомневаюсь, что комитет увидит прошлые проблемы разбора.Походит на концептуальное программирование .
Я не знаком с этим, но XL - язык, разработанный специально для него.
Lisp и Forth также поддерживают концептуальное программирование, хотя и меньше, чем XL. Я предлагаю Лисп, так как это очень практично и эффективно. Самым важным является ясный и гибкий синтаксис, а не нотация, которую предоставляет Lisp.
Вас может заинтересовать такой язык, как Haskell, который имеет очень гибкий, но унифицированный синтаксис.
источник
Не в моих знаниях.
Я не думаю, что это было бы особенно хорошей идеей - одно из основных преимуществ стандартного синтаксиса языка состоит в том, что многие могут его читать, и если бы каждый изобрел свой собственный синтаксис, то никто не смог бы понять чужой код. .... так что этот язык может быть интересным для любителей, но не очень полезен для чего-либо практического.
Наиболее близкая вещь, которая существует, вероятно, будет Lisp, где система макросов позволяет вам писать свои собственные языковые конструкции очень гибким способом. Обычно вы все равно придерживаетесь синтаксиса Lisp, но вы можете эффективно переопределить все, если действительно хотите.
В результате Lisps, как правило, особенно популярны для реализации DSL. Хорошим примером является DSL для доступа к данным в Clojure (Korma), который заботится обо всем шаблонном коде, необходимом для доступа к базе данных.
источник
Scala часто используется таким образом для создания DSL, специфичных для домена языков.
Главным образом это происходит потому, что в Scala нет операторов, а синтаксис вызова метода Scala может быть сокращен. Например:
5 является целочисленным объектом. Для расчета 5 плюс 7 вы можете написать
val ans = 5.add (7) за исключением того, что метод сложения на самом деле называется «+», поэтому вы должны написать:
val ans = 5. + (7), но в Scala вам не нужно включать «.» в вызовах методов или в скобках "()" вокруг аргументов, чтобы вызвать метод + объекта 5, вы должны написать
val ans = 5 + 7, что прекрасно работает, потому что в Scala нет операторов, которые могли бы помешать вашей умной схеме именования методов. Теперь распространите эту идею на ваши собственные классы и объекты, включая тот факт, что вы можете «переопределить» такие методы, как +, а также создать свои собственные методы с именами >>> или ::! или @ * @, или просто текстовые имена, такие как fancify.
источник
Не говоря уже о том, что вы должны использовать его, так как он все еще в основном экспериментальный, но одной интересной недавней парадигмой программирования является языковое программирование (LOP).
Сергей Дмитриев объясняет это более подробно .
Это идеология этого, но практически сводится к тому, что он поддерживает поведение, которое вы просите. Вы можете:
Самая активная среда программирования, о которой я знаю, следуя этой парадигме, - это бесплатная система метапрограммирования (MPS) от JetBrains.
На самом деле он начинает использоваться и в коммерческом программном обеспечении, так что, возможно, он начинает выходить из своей «экспериментальной» фазы:
источник
Специфичные для домена языки широко используются в сообществе Tcl. Например, нет ничего необычного в том, чтобы видеть программу Tcl, которая содержит и C, и SQL как встроенные DSL (через пакеты Critcl и Sqlite). Единственное ограничение для встроенного DSL состоит в том, что гораздо лучше, если встроенный язык уравновешивает свои фигурные скобки, и на практике это оказывается действительно необременительным требованием!
Еще одним языком, облегчающим работу с DSL, является Standard ML, который позволяет вам иметь доступ к необработанным токенам из универсального системного токенайзера (до момента, когда идентификаторы преобразуются в ключевые слова). Это облегчает создание широкого класса DSL - при условии, что они подчиняются некоторым основным синтаксическим правилам SML, особенно в отношении комментариев, строк и границ токенов - и фактически активно используется в ряде ключевых движущих приложений для языка (доказательство теорем и т. д.)
Не все языки делают это так просто. В частности, языки, которые автоматически разбирают содержимое терминов в скобках (многие из них многие!) Не могут этого сделать, поэтому они требуют, чтобы DSL создавался либо путем переопределения операторов, путем помещения дополнительного языка в строку, либо с помощью препроцессора, который переписывает DSL во что-то, что может быть обработано на главном языке.
источник
AFAIU вы ищете языки, которые могут помочь вам написать свой собственный DSL (предметно-ориентированный язык). Есть много хороших кандидатов. Лично я бы порекомендовал Ruby или Io, потому что они предлагают 1) простую перегрузку операторов, 2) метапрограммирование и 3) механизмы отката,
method_missing
которые вы можете использовать для создания своего собственного API. Например, взгляните на sqldsl , DSL, написанный на Ruby, который генерирует SQL, читая код Ruby.источник
Я на самом деле не использовал его как таковой, но, если я правильно помню, TXL специально разработан для перевода исходного кода. Таким образом, вы должны иметь возможность использовать его, чтобы указать, как переводить с вашего языка и / или языковых расширений на любой целевой реальный язык.
Кажется, у него есть грамматика для Javascript. Но, не используя его раньше, я не уверен, как именно это поможет вам.
источник
Есть хороший препроцессор, называемый PPWizard, довольно мощный. После того, как вы изучите его синтаксис, вы сможете создавать макроопределения для разных языков - не то чтобы это было бы глупо или забавно, но это полезный инструмент.
источник
Может быть, вы ищете компилятор компилятора. Компилятор компилятора берет определение языка, написанное на формальном языке, и создает компилятор для этого языка.
Взгляните на http://en.wikipedia.org/wiki/Compiler-compiler
источник
Одним из распространенных способов частичной персонализации языка программирования является использование макропроцессора. Например, вы можете запустить «dokkat-lang» через препроцессор C, прежде чем помещать результат в какую-либо среду javascript для его загрузки.
Сколько вы можете сделать, зависит от сложности вашего препроцессора. Обратите внимание, что ранние версии C ++, Objective C и различных экспериментальных языков были сделаны путем предварительной обработки исходного кода перед передачей в стандартный набор инструментов компилятора C.
источник