Events 功能过剩?

Events 功能过剩?,events,opengl,scheme,functional-programming,Events,Opengl,Scheme,Functional Programming,我通过限制自己不使用set!学习了一些Gambit-C方案中的函数编程!。我认为使用这个环境编写一个小型OpenGL游戏可能会很有趣,它似乎很适合游戏开发 然而,在使用OpenGL和GLUT时,似乎很难坚持功能风格并避免全局状态。我不认为这是游戏编程本身的一个基本限制,但基于回调的API(如GLUT)似乎不适合函数编程 例如,我试着把世界想象成一个变异状态向量流,它是时间步和用户输入事件交错列表的函数。这个想法似乎还可以,但异步编程似乎并不容易。例如,我必须为GLUT的display函数注册一个

我通过限制自己不使用set!学习了一些Gambit-C方案中的函数编程!。我认为使用这个环境编写一个小型OpenGL游戏可能会很有趣,它似乎很适合游戏开发

然而,在使用OpenGL和GLUT时,似乎很难坚持功能风格并避免全局状态。我不认为这是游戏编程本身的一个基本限制,但基于回调的API(如GLUT)似乎不适合函数编程

例如,我试着把世界想象成一个变异状态向量流,它是时间步和用户输入事件交错列表的函数。这个想法似乎还可以,但异步编程似乎并不容易。例如,我必须为GLUT的display函数注册一个回调,它应该能够以某种方式访问这个流中的“当前”项。同时,没有任何东西可以通过从它身上拿走来推动水流向前


理想情况下,我需要某种“外部”GLUT,这是一个主函数,某种程度上取决于(可能是一元的)在某个点执行的各种GLUT函数。如何围绕GLUT开发这样一种风格的游戏引擎,或者另一个问题是,我如何才能最成功地将GLUT从我的引擎中分离出来?有可能让GLUT向外部过程生成这样一个交错的事件列表吗?例如,Haskell是如何处理这个问题的?

您将很难实现一个功能强大的图形系统。即使Haskell绑定到GLUT也使用命令式编程,通过
IO
monad。我所听到的最接近您尝试做的事情是,但是库还没有准备好进入黄金时间,而且还严重缺乏关于它的真实教程。

对于像openGL这样具有状态的状态机来说,这是非常基本的


我看不出当副作用将一系列内容绘制到屏幕上时,如何实现无副作用的函数式编程。

你可以在函数图形库中找到一些想法。

写了这个问题后,我想了想,我开始怀疑答案是否在于利用共同惯例。如果游戏是由GLUT idle和display调用触发的功能性协同例程,那么这将很好地将游戏逻辑与GLUT的架构分离开来。比如说,很可能是那一套!无法避免,但如果使用了GLUT回调设置!只需修改正在馈入co例程的流,这可能会创建一个非常好的边界。有什么想法吗?在了解更多之前,我必须获得更多的co例程经验。

这里的问题不是太多的副作用,而是如何处理GLUT在需要完成某项工作时异步回调的事实,而不是建立功能依赖关系。我想知道是否有一种方法可以让它从某种外部GLUT的角度看起来像这样,但这可能不是一个很清楚的想法。对不起,我没有在openGL的字体加载项之外使用GLUT。我在考虑openGL的pop/push状态。我真的帮不了你。>我不明白当副作用将一组东西吸引到屏幕上时,你怎么能有无副作用的函数式编程。我们以一种纯功能性的方式用数字编程,尽管最后的输出步骤会绘制内容(“打印”)。类似地,函数图形的关键是提供一种数据类型,这种数据类型具有丰富而有用的代数,在这种代数中,组合(编程模型)发生,具有精确而易处理的语义,并且没有副作用。然后,不用担心画图,也不用担心如何打印数字。根据我记忆中使用call/cc阅读co例程的实现,我认为您仍然需要使用
set深入到您的共同例程库中。但我不会让它打扰你尽可能多地隐藏状态更改可能仍然会清理代码。是的,我想我开始喜欢这个想法了。如果我不能摆脱set!,下一个最好的方法是尽可能地使它接近于过量,同时通过将代码表示为一个似乎是懒惰列表的单一函数来疏远我的代码。然后,GLUT部分就是惰性事件列表的生成器。不管怎么说,正在努力