Ответ 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 прямо сейчас, я мог бы попробовать в этом.