首页 / 知识

关于函数式编程:为什么我应该学习Lisp?

2023-04-11 19:50:00

Why should I learn Lisp?

我真的觉得我应该学习Lisp,那里有很多好的资源可以帮助我做到这一点。

我不会因为复杂的语法而推迟,但是我会在"传统商业程序设计"中找到合适的地方使用它而不是过程语言。

有没有用Lisp编写的商业杀手级应用?


Lisp是一种庞大而复杂的语言,具有庞大而复杂的运行时来支持它。因此,Lisp最适合大型和复杂的问题。

现在,一个复杂的问题与一个复杂的问题并不相同。一个复杂的问题是有很多小细节的问题,但这并不难。编写机票预订系统是一项复杂的业务,但是有了足够的资金和程序员,这并不难。有所不同?

一个复杂的问题是一个令人费解的问题,传统的分而治之是行不通的。控制机器人,或使用非表格数据(例如语言)或高度动态的情况。

Lisp非常适合解决方案必须扩展的问题。经典示例是emacs文本编辑器。它是完全可编程的,因此它本身就是一个编程环境。

在他的著名著作《 PAIP》中,Norvig说Lisp是探索性编程的理想选择。也就是说,为尚未完全理解的问题编写解决方案(与在线预订系统相对)。换句话说:复杂的问题。

此外,学习Lisp会让您想起一些被遗忘的基本知识:冯·诺依曼和图灵之间的区别。众所周知,图灵的计算模型是一个有趣的理论模型,但对于设计计算机却毫无用处。另一方面,冯·诺依曼(Von Neumann)设计了一个计算机和计算执行方式的模型:冯·诺依曼(Von Neumann)模型。
冯·诺依曼模型的核心是您只有一个内存,并在其中存储代码和数据。请注意,Java程序(或C#或您喜欢的任何东西)是Turing模型的体现。一劳永逸地将程序设置为具体。然后,您希望可以处理所有抛出的数据。

Lisp维护了冯·诺伊曼(Von Neuman)模型;在代码和数据之间没有明确的预定边界。在Lisp中进行编程使您可以放心Von Neumann模型的强大功能。使用Lisp进行编程可以使您以新的眼光看待旧概念。

最后,是交互式的,您将在开发程序时学习与程序的交互(而不是编译和运行)。这也将改变您编程的方式以及您查看编程的方式。

有了这个介绍,我终于可以回答您的问题:您会找到比"传统"语言更好的地方吗?

如果您是高级程序员,则需要高级工具。而且没有比Lisp更先进的工具。
或者换句话说:如果您的问题很困难,答案是肯定的。没有其他。


回应@lassevk:

alt text


Lisp的主要用途之一是在人工智能中。我的一个大学朋友曾参加过AI研究生课程,在他的主要项目中,他用Lisp编写了" Lights Out"求解器。他的程序的多个版本使用了稍有不同的AI例程,并在40台左右的计算机上进行了测试,得出了一些非常整洁的结果(我希望它可以在线链接到我的电脑上,但我认为不是)。

两个学期前,我使用Scheme(一种基于Lisp的语言)编写了一个交互式程序,该程序模拟了Abbott和Costello的" Who's on First"例程。将来自用户的输入与一些相当复杂的数据结构(类似于其他语言的地图,但更加灵活)进行匹配,以选择适当的响应。我还编写了一个例程来解决3x3幻灯片难题(该算法可以很容易地扩展到更大的幻灯片难题)。

总而言之,学习Lisp(或Scheme)可能不会产生超出AI的许多实际应用,但正如许多其他人所述,这是极其宝贵的学习经验。使用Lisp之类的功能语言进行编程也可以帮助您进行递归思考(如果您在使用其他语言进行递归时遇到麻烦,这可能会很有帮助)。


复杂的语法?

Lisp的语法非常简单。

用Lisp编写的杀手级应用:emacs。 Lisp允许您随意扩展emacs,以执行编辑器可能想到的几乎所有事情。

但是,如果您愿意的话,应该只学习Lisp,而且您可能永远都不会在工作中使用它,但是它仍然很棒。

另外,我想补充一点:即使您找到了可以使用lisp的地方,您也可能不会说服其他人使用它,而应将其用于java,c ++,c#,python,ruby等。


我无法从第一手的经验中回答,但是您应该阅读Paul Graham在Lisp上写的内容。至于"杀手级应用"部分,请阅读击败平均值。


我用Lisp专业编程大约一年,这绝对值得学习。通过能够在可能的地方用函数替换所有的样板代码,而在可能的地方不替换宏,您将有空前的机会从代码中删除冗余。您还可以在运行时访问无与伦比的灵活性,在代码和数据之间自由转换。因此,Lisp真正发挥作用的地方是用户操作可以触发需要动态构建复杂结构的需求。流行的航班时刻表是用Lisp编写的,并且Lisp中也有很多CAD / CAM。


Lisp对于创建少量DSL非常有用。我有一个Lisp的副本在运行中的Box中运行,我写了一些DSL来查询SQL Server数据库并在C#中生成数据层等。现在,我所有的样板代码都写在输出到C#的lisp宏中。我用它生成HTML,XML和各种各样的东西。虽然我希望可以将Lisp用于日常编码,但Lisp可以带来实际的好处。


如果您喜欢编程,则应该学习Lisp的纯粹乐趣。 XKCD完美地表达了随之而来的智力启蒙。学习Lisp对程序员而言,冥想对和尚而言(我的意思是,这没有任何亵渎的含义)。


当不使用一种语言的通用缩进约定时,任何一种语言看起来都会困难得多。当人们遵循Lisp时,就会看到它如何很容易地表达语法树结构(请注意,这并不完全正确,因为预览位置有点; r应该与递归quicksort参数中的fns对齐):

1
2
3
4
5
6
7
8
9
10
11
12
(defun quicksort (lis)
  (if (null lis)
      nil
      (let* ((x (car lis))
             (r (cdr lis))
             (fn (lambda (a)
                   (< a x))))
         (append (quicksort (remove-if-not fn
                                           r))
                 (list x)
                 (quicksort (remove-if fn
                                       r))))))


" Lisp对于您最终获得的深刻启发经验值得学习;即使您从未真正使用Lisp本身,这种经验也将使您在余下的时间里成为一名更好的程序员。"

-埃里克·雷蒙德(Eric S. Raymond),"如何成为黑客"

http://www.paulgraham.com/avg.html


我上世纪八十年代在大学里上过" lisp课"。尽管忽略了课堂上提出的所有概念,但使lisp变得如此出色的原因我却一无所获。恐怕很多人将Lisp视为另一种编程语言,这就是这么多年前大学课程为我所做的。如果您看到有人抱怨Lisp语法(或缺乏Lisp语法),那么他们很可能是未能掌握Lisp的伟大之处的人之一。我很长一段时间就是其中之一。

直到二十年后,当我重新点燃了对Lisp的兴趣时,我才开始"发现"了使Lisp变得有趣的东西-无论如何对我来说。如果您在学习Lisp时没有被闭包和Lisp宏所震撼,那么您可能已经错过了重点。


从http://www.gigamonkeys.com/book/introduction-why-lisp.html

One of the most commonly repeated
myths about Lisp is that it's"dead."
While it's true that Common Lisp isn't
as widely used as, say, Visual Basic
or Java, it seems strange to describe
a language that continues to be used
for new development and that continues
to attract new users as"dead." Some
recent Lisp success stories include
Paul Graham's Viaweb, which became
Yahoo Store when Yahoo bought his
company; ITA Software's airfare
pricing and shopping system, QPX, used
by the online ticket seller Orbitz and
others; Naughty Dog's game for the
PlayStation 2, Jak and Daxter, which
is largely written in a
domain-specific Lisp dialect Naughty
Dog invented called GOAL, whose
compiler is itself written in Common
Lisp; and the Roomba, the autonomous
robotic vacuum cleaner, whose software
is written in L, a downwardly
compatible subset of Common Lisp.
Perhaps even more telling is the
growth of the Common-Lisp.net Web
site, which hosts open-source Common
Lisp projects, and the number of local
Lisp user groups that have sprung up
in the past couple of years.


学习LISP / Scheme可能不会给您任何增加的应用程序空间,但是它将帮助您更好地理解函数式编程,其规则和异常。

仅仅花时间去学习六个嵌套纯函数的美,以及六个带有副作用的嵌套函数的噩梦,这是值得的时间投入。


我发现学习一种新语言始终会影响您已经知道的语言的编程风格。对我来说,它总是使我以不同的方式思考以我的主要语言Java解决问题。我认为一般来说,它只是拓宽了您的编程视野。


我同意Lisp是您可能永远不会在商业环境中使用的那些语言之一。但是,即使您不懂,学习它肯定也会扩大您对整个编程的理解。例如,我在大学期间就学习过Prolog,虽然我以后从未使用过它,但是我却使我对许多编程概念有了更深入的了解,并且(有时)对我使用的语言有了更深的了解。

但是,如果您要学习它……一定要阅读《关于Lisp》


好的,我可能很奇怪,但是我真的不喜欢Paul Graham的论文,如果您还不了解Common Lisp,那么关于Lisp的书将是一本非常粗糙的书。相反,我会说选择Siebel的《实践通用Lisp》。至于"杀手级应用程序",Common Lisp似乎在诸如ITA之类的小众商店中找到了自己的位置,因此,尽管没有像CL那样的应用程序与Rails对于Ruby的含义相同,但是如果您愿意的话,行业中也会有使用它的地方。有点挖。


金普(Gimp)的剧本赋是令人垂涎的。那是一个photoshop-killer应用程序。


学习Lisp将使Java完全不同! Lisp确实迫使您掌握递归和整个"作为一流对象的功能"范式。参见Crockfords关于Scheme vs Javascript的出色文章。 Java语言可能是当今最重要的语言,因此更好地理解它非常有用!


如果您必须问自己是否应该学习口齿不清,您可能不需要。


语法复杂吗? Lisp的优点在于它具有非常简单的语法。它只是一个列表,列表中的每个元素可以是另一个列表或基本数据类型。

值得学习的是,因为它可以增强您的编码能力,从而可以将函数作为另一种数据类型进行思考和使用。这将改善您使用命令式和/或面向对象的语言进行编码的方式,因为这将使您在代码结构方面更加灵活。


杀手级应用? Franz Inc.有很多成功的故事,但是该列表仅包括AllegroCL的用户...可能还有其他人。我最喜欢的是有关顽皮狗的故事,因为我是Crash Bandicoot游戏的忠实粉丝。

为了学习Common Lisp,我建议您使用Practical Lisp。它有一个动手的方法,至少对我来说,它比我看过的其他书更容易。


您今天可以使用Clojure在Java VM之上编写测试和脚本。尽管在JVM上实现了其他Lisp语言,但我认为Clojure在与Java集成方面做得最好。

有时Java语言本身会妨碍编写Java代码测试(包括"传统商业编程")。 (我并不是说要对Java提出起诉-其他语言也会遇到同样的问题-但这是事实。既然不是Java,而是主题,我就不再赘述。如果有,请随意开始一个新主题。有人想讨论它。)Clojure消除了许多障碍。


Lisp可以在使用传统编程的任何地方使用。没什么不同,只是功能更强大。编写网络应用程序?您可以在Lisp上完成编写桌面应用程序吗?您可以在Lisp上执行此操作,无论如何,您可能可以在Lisp,Python或任何其他通用编程上执行(有几种语言仅适合一项任务)。

最大的障碍可能是老板,同事或客户的接受度。那是您必须与他们合作的事情。选择一种实用的解决方案,例如Clojure,可以利用从JVM到库的Java基础结构的当前安装基础,可能会对您有所帮助。另外,如果您有Java程序,则可以做一个插件架构,并为其编写Clojure插件,最后用Clojure编写一半的代码。


要添加其他答案:

因为SICP课程(此处提供视频)非常棒:可以教您Lisp以及更多内容!


这是我本人已经思考了一段时间的话题,但是我还没有真正决定,因为通常的时间是主要问题...;)

由于在这篇文章中找不到这些链接,因此出于公共利益考虑将它们添加:

成功与失败的故事:
在JPL聆听

真正令人印象深刻的成功故事:
Lisp在Orbitz公司使用

比较和分析是否使用Lisp代替Java:
Lisp替代Java


这不是原因,而是(平凡的)AutoCAD具有LISP和DCL运行时支持。如果您不想使用VBA或其C ++或.NET SDK,或者如果DIESEL表达式不能剪切它,这是一种编写复杂宏(包括ActiveX自动化)的便捷方法。

AutoCAD的许多功能实际上都是LISP例程。


语法无关紧要,可读性不是!


并不是说这是一个杀手级应用,但看起来可能很酷
http://code.google.com/p/plop/


杀手级应用? ITA Software的航班搜索引擎就是其中之一。

至于"为什么",它很可能使您成为更好的开发人员,而极不可能使您变得更糟。但是,与其他语言相比,它可能会让您更喜欢Lisp方言。


学习函数式编程程序设计语法

最新内容

相关内容

热门文章

推荐文章

标签云

猜你喜欢