Я немного изучаю функциональное программирование в Gambit-C Scheme, ограничивая себя тем, что не использую set !. Я подумал, что было бы забавно написать небольшую игру OpenGL с использованием этой среды, которая, кажется, хорошо подходит для разработки игр.
Однако при использовании OpenGL и GLUT трудно придерживаться функционального стиля и избегать глобального состояния. Я не думаю, что это является фундаментальным ограничением игрового программирования как такового, но API, основанный на обратном вызове, такой как GLUT, кажется, не очень хорошо работает с функциональным программированием.
Например, я пытаюсь представить мир как поток мутирующих векторов состояния, который является функцией чередующегося списка временных шагов и событий пользовательского ввода. Эта идея кажется приемлемой, но с асинхронным программированием она кажется нелегкой. Например, мне нужно зарегистрировать обратный вызов для функции отображения GLUT, которая должна каким-то образом иметь доступ к «текущему» элементу в этом потоке. Между тем нет ничего, что могло бы продвинуть поток вперед, взяв его.
В идеале мне нужно что-то вроде «внешней» GLUT, основной функции, которая каким-то образом зависит (возможно, монадически) от различных функций GLUT, которые выполнялись в какой-то момент. Как можно разработать такой стиль игрового движка вокруг GLUT или еще один вопрос: как я могу наиболее успешно изолировать GLUT от своего движка? Возможно ли, чтобы GLUT генерировал такой чередующийся список событий для внешней процедуры? Как, например, Haskell справляется с этим?