September 10th, 2011

Морда-1
  • yushi

Встроенная Схема и указатель на объект

Здравствуйте!

Есть проект на C++, к некоторым классам которого автоматически создаются привязки с помощью SWIG. Есть желание прикрутить к нему скрипты на Scheme. Вопрос: есть ли какой-то способ вызвать из кода на C++ схемную функцию, передав ей в качестве аргумента указатель на объект? (Желательно обёрнутый в SWIG-овский тип, но если у какой-то из встраиваемых Схем, не обязательно из числа поддерживаемых SWIG, есть для этого собственные средства, в крайнем случае сгодятся и они.)

Самостоятельно я способа это сделать в документации на SWIG и на три поддерживаемых им интерпретатора (CHICKEN, Guile, Racket) не нашёл. Пока остановился на таком решении: есть уникальный индентификатор объёкта (в моём случае оказалось удобно использовать обычную C-шную строку, char*) и C-шная функция, получающая по этому идентификатору указатель на объект. В схемную функцию передаётся идентификатор, а в написанных на C++ функциях, экспортируемых в Схему, по этому идентификатору снова получается указатель на объект. Но мне самому это решение не нравится, и ручной работы получается многовато, и архитектура выходит, на мой вкус, уродливой.

Кстати, все три Схемы, которые поддерживаются SWIG, показались мне не очень подходящими для прикручивания к плюсовому проекту. В Guile 1.8 тип SCM несовместим со стандартом C++ (в 2.0 это вроде поправили, но 2.0 поставишь сильно не во всякое окружение, уж больно новых библиотек он хочет). В CHICKEN очень расстроила тамошняя система пакетов, работающая в обход пакетного менеджера ОС, что гарантирует танцы с бубном при деплое (у меня не удалось заставить её нормально и стабильно работать). В Racket — количество телодвижений, необходимых, чтобы дёрнуть интерпретатор из своего C-шного кода.

Кто использовал скрипты на Scheme в своих приложениях на C++? Каким интерпретатором для этого пользовались? Насколько реально прикрутить в этих целях, например, Gambit?