Lisp/Схема DSEL в С++

Я наткнулся на следующее сообщение в форматировать списки рассылки (внимание мое):

привет всем,

     

знает ли кто-нибудь о существующем духе / lisp implimentation, и есть ли   любой интерес к разработке такого проекта в open source?

Пока нет, AFAIK.

Я напишу пример для Spirit2 в дополнение к миниатюрному C-виртуальному машина там. Что одинаково Интересно, хотя это схема (или по крайней мере, подмножество) может быть реализован в чистом С++. Нет разбора, просто чистая DSEL в С++. Теперь представьте себе анализатор, который нацелен на этот DSEL (через С++) - источник для источника перевода. По сути, ваш код схемы будет скомпилирован в высокоэффективный С++.

Кто-нибудь действительно сделал это? Я был бы очень заинтересован в такой DSEL.

Ответ 1

Я написал Lisp -подобный язык под названием Funky, используя Spirit в С++. Версия с открытым исходным кодом доступна по адресу http://funky.vlinder.ca. Это не займет слишком много времени, чтобы превратить это в Lisp -подобный для С++-переводчика.

На самом деле, что потребуется, это библиотека поддержки во время выполнения, чтобы обеспечить общее время закрытия и somesuch: если вы хотите превратить код Lisp в эффективный С++, вам понадобятся классы С++ (функторы и т.д.), чтобы выполнить тяжелую работу, как только вы доберетесь до времени выполнения, поэтому ваш переводчик Lisp -to-С++ должен будет:

  • проанализируйте Lisp
  • создать AST из Lisp
  • преобразуйте AST для оптимизации, если это возможно (оптимизация в Lisp отличается от оптимизаций на С++, поэтому, если вы хотите ускорить С++, вам нужно оптимизировать Lisp и позволить вашему компилятору С++ оптимизировать сгенерированный С++ )
  • сгенерируйте С++, для которого вы будете полагаться на свою библиотеку поддержки во время выполнения для таких функций, как встроенные функции, типы функторов и т.д.

Если бы вы начали с Funky, у вас уже был бы анализ и AST (хотя Funky не оптимизирует AST), поэтому вы могли бы оттуда создать время выполнения и сгенерировать С++...

Сложно было бы написать и с нуля: Lisp грамматика не так уж трудна, поэтому большая часть работы пойдет в AST и поддержку времени выполнения.

Если бы я не писал объектно-ориентированную DSL прямо сейчас, я мог бы попробовать в этом.