大多数人都同意LISP有助于解决在项目开始时尚未明确定义或未完全理解的问题.
"未完全理解""可能表明我们不知道我们正在尝试解决什么问题,因此开发人员不断改进问题域.但这个流程语言不是独立的吗?
所有这些改进并没有消除对开发需要解决的最终问题的算法/解决方案的需求.这就是实际的工作.
所以,如果开发人员不知道他要去哪里解决一个尚未最终确定的问题,我不确定LISP提供了什么优势.
Eli*_*lay 13
当您遇到没有明确定义的问题时,Lisp(不是"LISP")有许多优点.首先,你有一个可以快速试验的REPL - 这有助于绘制快速功能并尝试使用它们,从而导致非常快速的开发周期.其次,拥有动态类型的语言在这种情况下运行良好:使用静态类型语言,您需要在开始之前"设计更多",并且更改设计会导致更改更多代码 - 相比之下,使用Lisps,您只需编写代码和它运行的数据可以根据需要改变.除此之外,还有功能语言的常见好处 - 具有一流lambda功能的语言等(例如,垃圾收集).
总的来说,这些优势一直在寻找其他语言.例如,Javascript包含我到目前为止列出的所有内容.但Lisps还有一个优势,即其他语言中仍然没有 - 宏.当您的问题需要特定于域的语言时,这是一个重要的工具.基本上,在Lisp中,您可以使用特定于您的问题的结构扩展语言 - 即使这些结构导致完全不同的语言.
最后,您需要提前计划代码变得不仅仅是快速实验时会发生什么.在这种情况下,您希望您的语言能够应对"将脚本增长到应用程序中" - 例如,拥有模块系统意味着您可以获得更"严肃"的应用程序.例如,在Racket中,您可以将解决方案分成这样的模块,每个模块都可以用自己的语言编写 - 它甚至还有一个静态类型的语言,这使得可以从动态类型的开发周期开始,一旦代码变为更稳定和/或更大,维护变得困难,您可以将一些模块切换到静态语言并从中获得通常的好处.在这种支持下,Racket在Lisps和Schemes中实际上是独一无二的,但即使与其他人相比,情况仍然比非Lisp语言更先进.
在AI(人工智能)中,历史上Lisp被视为AI汇编语言.它用于构建更高级别的语言,有助于以更直接的方式处理问题域.许多这些领域需要大量的"知识"来寻找可用的答案.
典型的例子是用于石油勘探的专家系统.专家系统作为输入(地质)观测,并提供有关寻找石油的机会,什么样的石油,在什么深度等的信息.为此,它需要"专家知识"如何解释数据.当您开始开发这样一个专家系统的项目时,通常不清楚需要什么样的推论,什么样的"知识"专家可以提供什么,以及如何为计算机写下这些"知识".
在这种情况下,通常会在Lisp之上开发新语言,而您不使用固定的预定义语言.
作为一个例子,请参阅这篇关于Dipmeter Advisor的旧论文,这是一个由Schlumberger在20世纪80年代开发的基于Lisp的专家系统.
所以,Lisp没有解决任何问题.但它最初用于解决编程复杂的问题,通过提供新的语言层,这样可以更容易地表达域"知识",规则,约束等,以找到不直接计算的解决方案.