Я написал похожий на Лисп язык под названием Funky, используя Spirit в C ++. Версия с открытым исходным кодом доступна по адресу http://funky.vlinder.ca.. Чтобы превратить ее в переводчик, похожий на Lisp-C ++, не потребовалось бы много времени.
На самом деле, требуется библиотека поддержки времени выполнения для обеспечения общего времени закрытия и тому подобное: если вы хотите превратить код Lisp в эффективный C ++, вам в основном понадобятся классы C ++ (функторы и т. Д.) Для выполнения как только вы доберетесь до времени выполнения, ваш переводчик Lisp-to-C ++ должен будет:
- разбор Лисп
- создать AST из Lisp
- преобразуйте AST, чтобы оптимизировать его, если это возможно (оптимизации в Lisp отличаются от оптимизаций в C ++, поэтому, если вы хотите быстро увеличить C ++, вы должны оптимизировать Lisp и позволить вашему компилятору C ++ оптимизировать сгенерированный C ++)
- генерирует C ++, для которого вы полагаетесь на свою библиотеку поддержки времени выполнения для таких вещей, как встроенные функции, типы функторов и т. Д.
Если бы вы начали с Funky, у вас уже были бы разбор и AST (хотя Funky не оптимизирует AST), так что вы могли бы оттуда создать среду выполнения и сгенерировать C ++ .. .
Также было бы не слишком сложно написать его с нуля: грамматика Lisp не так уж сложна, поэтому большая часть работы будет посвящена AST и поддержке во время выполнения.
Если бы я сейчас не писал объектно-ориентированный DSL, я мог бы попробовать свои силы в этом.