Lisp Интерпретатор в программе на С++

Я не уверен, что формулирую это право, но я уверен, что ищу переводчик LISP, который я могу поместить в свою программу на С++.

Идеальная ситуация, которую я представляю, - это функция или что-то, к чему я могу передать либо строку, файл, либо имя файла, содержащую код LISP, а затем использовать вывод из кода LISP в других частях.

Чтобы выразить это в терминах (print (eval (read))), я хочу, чтобы read был чем-то, что я вводил, чтобы читать то, и строку или что-то, что я могу проанализировать из печати. ​​

Ответ 1

Существует также ECL ( "Embeddable Common Lisp" ). Преимущество состоит в том, что он обеспечивает полный общий стандарт Lisp. К сожалению, документация в отношении внедрения - это... ну... немного скуднее.

Я никогда не использовал его сам, поэтому я не могу сказать, действительно ли это будет легко встраивать в ваше приложение. ИМХО, переводчик Guile был бы разумным выбором.

Другой встраиваемый Lisp - Rep, который, например, является языком расширения, используемым диспетчером окон Sawfish. Он начинался как с Emacs Lisp, но со временем становился чем-то другим, и теперь он ближе к Схеме.

Ответ 2

Если вас интересует Common Lisp, ECL.

Из FAQ:

2.1 Что означает это "вложение"?

ECL - полноценный выход реализация Common- Lispязык. Однако из-за, реализация может использовать в качестве языка расширяемости для вашего собственного приложения, Guile работает на языке Scheme. Путем довольно простого набора функций, вы можете анализировать, компилировать и выполнять Common-Lisp и используя Интерфейс внешней функции (FFI), вы может добавить новые функции в Common- Lispкоторые подходят для вашего домена Язык.

и

2.2 Как включить ECL в мое приложение?

Вы должны использовать библиотеку ECL, которая называется libecl.so, libecl.dyld или ecl.dll, в зависимости от вашей операционной (Unix, Mac OSX или Windows). программа ecl-config предоставит вам с флагами, которые вы должны перенести на C/С++ и компоновщику, используя либо ecl-config -cflags, либо ecl-config --ldflags, соответственно. Что касается вашей программы, кроме связывая с библиотекой ECL, вы должны вызвать правильную инициализацию, cl_boot(), так что ECL устанавливает вверх по соответствующим внутренним структурам. После вызова этой процедуры вы иметь возможность запускать код lisp и создавать или манипулировать данными lisp

.

Ответ 3

Это не Lisp, но Guile - это язык сценариев перекрестной платформы GNU и является интерпретатором/компилятором для Scheme, который довольно близко к Lisp.

Ответ 4

Вы можете использовать GNU Guile, который является интерпретатором Схемы, специально разработанным для простой встраивания в программы на C/С++.

Ответ 6

Для чего-то еще более вложимого, чем Guile, там также Chibi.

(I < 3 Guile BTW, поэтому этот ответ не пытается отнять у него --- он просто предлагает другой вариант.)