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