Через тернии к звездам
На работе пришел к немного странному, на первый взгляд, решению: из окемловского приложения вызываю питовский код, который, в свою очередь, вызывает плюсовый. Казалось бы - что за изврат? Ан нет.
Логика игры, которую мы сейчас делаем (равно как и предыдущей игры) пишется на ocaml. Низкоуровневая работа с OSG, OpenGL, OpenAL и пр., ведется на С++. Окемловских байндиногв для OSG нет, есть питоновские. А писать окемловкие байндинги для С++ гимор тот еще.
В итоге, все плюсовые дела через boost::python (очень удобная библиотека, кстати) выводятся в питон. В питоне пишется тонкий слой, переводящий работу с объектами в примитивные функции. А в кемле написан небольшой код на полстранички, который позволяет легко и type-safe-но вытаскивать функцию из питона. Например:
let fun1 = f "module" "fun1"благодаря написанному ручками оператору
(type1 **-> type2 **-> ret_type)
(**->)определяет функцию
(f : type1 -> type2 -> ret_type)Ну где вы еще такое напишите, кроме окемла или хаскела :)
За счет этого, я с минимальными усилиями получаю из ocaml доступ к плюсовому коду.
Так что не бойтесь применения разных языков программирования в одном проекте. Это не так уж сложно и впридачу вы имеете возможность писать то, что надо, на том, на чем надо.
3 комментария:
Круто канешн, но я б наверное не решился тащить интерпретатор питона только для того чтоб связать OCaml и C++.. :)
Дело в том, что для OpenSceneGraph, который я юзаю в игре, а равно как для много чего еще уже имеются питоновские байндинги. А вызвать питоновскию ф-ю из ocaml много проще, чем писать плюсовый байндинг.
Как насчет http://www.swig.org/ ?
Отправить комментарий