Functional programming 函数式语言是飞行模拟器的好选择吗?Lisp怎么样?

Functional programming 函数式语言是飞行模拟器的好选择吗?Lisp怎么样?,functional-programming,lisp,simulation,Functional Programming,Lisp,Simulation,我做面向对象编程已经有几年了,但我没有做太多的函数式编程。我对飞行模拟器感兴趣,并且对Lisp的函数编程方面很好奇。在面向对象的范例中,飞行模拟器或任何其他真实世界的模拟器对我来说都是有意义的 以下是我的问题: 面向对象是表示真实世界仿真领域的最佳方式吗 我知道CommonLisp有CLOS(OOforLisp),但我的问题实际上是用函数式语言编写飞行模拟器。所以,如果您打算用Lisp编写它,您会选择使用CLOS还是以函数的方式编写它 有人想过用lisp或任何函数式语言编写飞行模拟器吗 更新11

我做面向对象编程已经有几年了,但我没有做太多的函数式编程。我对飞行模拟器感兴趣,并且对Lisp的函数编程方面很好奇。在面向对象的范例中,飞行模拟器或任何其他真实世界的模拟器对我来说都是有意义的

以下是我的问题:

面向对象是表示真实世界仿真领域的最佳方式吗

我知道CommonLisp有CLOS(OOforLisp),但我的问题实际上是用函数式语言编写飞行模拟器。所以,如果您打算用Lisp编写它,您会选择使用CLOS还是以函数的方式编写它

有人想过用lisp或任何函数式语言编写飞行模拟器吗


更新11/8/12-对于那些感兴趣的人来说,一个类似的SO问题->

我不会说函数式编程特别适合飞行模拟。一般来说,函数式语言对于编写科学模拟非常有用,尽管这是一个稍微特殊的例子。实际上,使用标准命令式(最好是OOP)语言(如C++/C#/Java)可能会更好,因为它们往往有更好的物理库和图形API,这两种语言都需要大量使用。此外,OOP方法可能更容易表示您的环境。另一点需要考虑的是(据我所知)今天市场上流行的飞行模拟器几乎完全是用C++编写的。
本质上,我的理念是,如果没有特别好的理由需要使用函数范式,那么就不要使用函数式语言(尽管没有什么可以阻止您在OOP/混合语言中使用函数式构造)。我猜想,在使用C++的测试API和更常用的与游戏开发相关的语言(这与飞行SIM有很多共性)的开发过程中,您将不会有那么多痛苦。现在,如果你想在模拟器中添加一些复杂的人工智能,Lisp可能看起来是一个更明显的选择,尽管即使这样,我也不会同意。最后,如果你真的喜欢使用函数式语言,我建议你选择一种更通用的语言,比如Python,甚至F#(两种混合命令式函数式语言),而不是Lisp,因为Lisp在这样的项目中可能会变得相当难看。

想到“Lisp”是一个常见的错误作为一种功能性语言。实际上,人们最好把它看作是一个语言家族,但现在人们说Lisp通常指的是Common Lisp

CommonLisp允许函数式编程,但它本身不是函数式语言。相反,它是一种通用语言。Scheme是一个小得多的变体,在定向方面更具功能,当然还有其他变体

至于你的问题,这是一个好的选择吗?那要看你的计划了。CommonLisp在这方面尤其有一些真正的优势。在所谓的脚本语言中,它既具有交互性,又具有内省性,这使得它的开发速度非常快。同时,它的编译器已经编译并具有高效的编译器,因此您可以期望与其他高效编译器的性能相同(典型的ime是c的2倍)。虽然是一种大型语言,但它的设计比C++更为一致,元编程能力可以为特定应用程序提供非常干净、易于理解的代码。如果你只看这些方面 CommonLisp看起来很棒

然而,也有不利的一面。社区很小,如果你想找人帮忙的话,你不会找到很多人。虽然内置库很大,但您找不到那么多的第三方库,因此您可能会从头开始编写更多的库。最后,虽然CL绝不是一个有围墙的花园,但它并没有像python那样与外国库进行平滑集成。这并不意味着你不能调用c代码,有很多很好的工具

顺便说一句,CLOS是我能想到的最强大的OO系统,但是如果你来自主流的c++/java/c#/etc。OO背景(是的,它们有所不同,但不限于单个和多个inh。没有那么多),你可能会发现一开始有点奇怪,几乎是翻了个底朝天

如果您走这条路,您将不得不注意实际渲染管道的性能问题,如果您自己使用CLOS编写的话。类系统具有难以置信的运行时灵活性(即,在运行时更新类定义不是通过猴子补丁等,而是通过实际更改类和更新实例),但是您需要为此支付一些调度成本

值得一提的是,我过去曾将CL用于需要数值效率的研究代码,即不同种类的模拟。它对我很有效。在这种情况下,我并不担心使用现有的代码——它并不存在,所以我几乎从零开始编写所有的东西


总之,对于这个项目来说,它可能是一个不错的语言选择,但不是唯一的选择。如果您不使用既有高级方面又有良好性能的语言(如CL、OCaml和其他一些语言),我肯定会考虑使用lua或python(大量libs)等语言实现两级方法的可能性在一些C或C++代码中,重量级的函数。

函数式语言有一些问题,也就是说它们与状态不太好,但是它们与进程很好。所以在某种程度上可以说他们是以行动为导向的。这意味着您将浪费时间模拟飞机,您要做的是模拟驾驶飞机的动作。一旦你确定你可能得到它

   velocity <- {some expression of airspeed, heading, gravity etc.}
   position <- integrate <- velocity
   groundLevel <- getGroundLevel <- position
   altitude <- getAltitude <- position
   crashed <- liftA2 (<) altitude groundLevel