Lisp 什么是「;定义不太明确的问题”;口齿不清应该解决什么问题?

Lisp 什么是「;定义不太明确的问题”;口齿不清应该解决什么问题?,lisp,Lisp,大多数人都同意LISP有助于解决定义不明确或在项目开始时未完全理解的问题 “未完全理解”可能表示我们不知道要解决什么问题,因此开发人员会不断地细化问题域。但这个过程语言不是独立的吗 所有这些改进并没有消除(比如)为最终需要解决的问题开发算法/解决方案的需要,而这就是实际工作 因此,如果开发人员不知道自己要去哪里,即解决一个尚未完成的问题,我不确定LISP提供了什么优势。LISP(不是“LISP”)当您面临定义不明确的问题时,REPL有许多优点。首先,您有一个REPL,可以在其中快速进行试验——这

大多数人都同意LISP有助于解决定义不明确或在项目开始时未完全理解的问题

“未完全理解”可能表示我们不知道要解决什么问题,因此开发人员会不断地细化问题域。但这个过程语言不是独立的吗

所有这些改进并没有消除(比如)为最终需要解决的问题开发算法/解决方案的需要,而这就是实际工作

因此,如果开发人员不知道自己要去哪里,即解决一个尚未完成的问题,我不确定LISP提供了什么优势。

LISP(不是“LISP”)当您面临定义不明确的问题时,REPL有许多优点。首先,您有一个REPL,可以在其中快速进行试验——这有助于勾勒出快速函数并尝试使用它们,从而导致非常快速的开发周期。其次,拥有一种动态类型的语言在这种环境下运行良好太:使用静态类型语言,您需要“设计更多”“在开始之前,更改设计会导致更改更多的代码——相反,使用Lisps只需编写代码,它所操作的数据可以根据需要更改。除此之外,函数式语言还有一些常见的优点——它具有一流的
lambda
函数等(如垃圾收集)

总的来说,这些优势已经在其他语言中得到了体现。例如,Javascript包含了我目前列出的所有内容。但是Lisps还有一个在其他语言中还没有的优势——宏。当您的问题需要特定于领域的语言时,这是一个重要的工具。基本上,在Lisp中,您可以使用特定于您的问题的结构来扩展语言——即使这些结构导致了一种完全不同的语言

最后,您需要提前计划当代码不仅仅是一个快速的实验时会发生什么。在这种情况下,您希望您的语言能够应对“将脚本增长到应用程序中”——例如,拥有一个模块系统意味着您可以获得更“严肃”的 应用例如,在中,您可以将您的解决方案分成这样的模块,每个模块都可以用自己的语言编写--它甚至有一种静态类型的语言,这样就可以从动态类型的开发周期开始,一旦代码变得更稳定和/或足够大,维护变得困难,您可以将一些模块转换为静态语言,并从中获得通常的好处。Racket在这种支持方面在Lisp和Scheme中是独一无二的,但即使在其他语言中,这种情况也远比在非Lisp语言中先进。

在AI(人工智能)中,历史上Lisp被视为AI汇编语言。它被用来构建更高层次的语言,帮助以更直接的方式处理问题域。这些领域中的许多领域需要大量的“知识”才能找到可用的答案

一个典型的例子是一个专家系统,比如说石油勘探。专家系统获取(地质)观测数据作为输入,并提供有关发现石油的机会、石油类型、深度等信息。要做到这一点,需要“专家知识”如何解释数据。当你启动这样一个项目来开发这样一个专家系统时,通常不清楚需要什么样的推理,专家可以提供什么样的“知识”,以及如何为计算机写下这些“知识”

在这种情况下,通常在Lisp的基础上开发新的语言,而不是使用固定的预定义语言

作为一个例子,请参阅这篇关于80年代斯伦贝谢公司开发的基于Lisp的专家系统的老文章

因此,Lisp不能解决任何问题。但它最初用于解决编程复杂的问题,通过提供新的语言层,可以更容易地表达领域的“知识”、规则、约束等,从而找到不直接计算的解决方案。

允许增量开发的语言的“大”胜利在于(通常)有一个与之交互的read-eval-print循环(或“侦听器”或“控制台”),另外,在编译和加载新代码时,不需要丢失状态

从一个测试运行到另一个测试运行保持状态的能力意味着不受更改影响的冗长计算可以简单地保持不变,而不是重新计算


这使您能够更快地进行实验和迭代。能够更快地迭代意味着探索不那么麻烦。这对于探索性编程非常有用,这是处理定义不太明确的问题的典型方式。

ot:祝贺10k@EliBarzilay。我想指出的是,这个问题中没有什么完全符合规范的例如,我认为C语言在解决定义不明确的问题方面比汇编语言更好,我同意开发算法/解决方案仍然需要用任何语言完成,但这并不意味着C语言比汇编语言没有优势。谢谢Ken,但这个问题的目的是问为什么每个lis中都会出现这一点在这方面,同样的主张并不支持C语言或任何其他语言。我不想在这里比较语言的有效性。