我为什么要学习Lisp?

Dav*_*vid 125 lisp functional-programming

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

我不会被复杂的语法所拖延,但在"传统的商业编程"中我会找到使用它而不是过程语言的地方.

是否有一个用Lisp编写的商业杀手应用程序?

小智 126

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

现在,一个复杂的问题是不一样的一个复杂的一个.一个复杂的问题是有很多小细节的问题,但这并不困难.编写航空公司预订系统是一项复杂的业务,但有足够的资金和程序员并不难.有所作为?

一个复杂的问题是一个复杂的问题,一个传统的分而治之不起作用的问题.控制机器人,或处理非表格(例如语言)或高度动态情况的数据.

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

在他着名的书籍PAIP中,Norvig说Lisp是探索性编程的理想选择.也就是说,为一个尚未完全理解的问题(与在线预订系统相对)编制解决方案.换句话说:复杂的问题.

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

Lisp维护Von Neuman模型; 代码和数据之间没有明确的预定边界.Lisp中的编程让您了解Von Neumann模型的强大功能.使用Lisp编程可以让您以全新的视角看待旧概念.

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

通过这个介绍,我终于可以回答你的问题了:你会找到比"传统"语言更优秀的地方吗?

如果您是高级程序员,则需要高级工具.并且没有比Lisp更先进的工具.或者,换句话说:如果你的问题很难,答案是肯定的.不,否则.

  • "但是有足够的钱和程序员并不难" - 这说,给予足够多的程序员它变得不可能;-) (30认同)

Jus*_*ett 55

Lisp的主要用途之一是人工智能.我的一个朋友在大学学习了AI课程,在他的主要项目中,他在Lisp中写了一个" Lights Out "解算器.他的程序的多个版本使用了稍微不同的AI例程,并且在40台左右的计算机上进行了测试,得到了一些非常简洁的结果(我希望它可以在某个地方联机供我链接,但我认为不是这样).

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

总之,学习Lisp(或Scheme)可能不会产生超出AI的许多实际应用,但它是一种非常有价值的学习体验,正如许多其他人所说的那样.用像Lisp这样的函数式语言编程也可以帮助你递归思考(如果你在其他语言中使用递归时遇到麻烦,这可能是一个很好的帮助).

  • "请不要认为Common Lisp仅对数据库,单元测试框架,垃圾邮件过滤器,ID3解析器,Web编程,Shoutcast服务器,HTML生成解释器和HTML生成编译器有用,因为这些是唯一真正实现的内容.实用CL" (32认同)
  • @JustinBennett是的,你说的.这里:"总之,学习Lisp(或Scheme)可能不会产生超出AI的许多实际应用".我讨厌人们在面对错误的时候. (22认同)
  • 我没有说它只用于人工智能,我说其中一个主要用途是人工智能.你读过它吗? (6认同)
  • 你为什么说Lisp只对AI有好处?此外,它是一种多范式语言.功能只是它实现的几种范例之一. (5认同)

Jus*_*ard 46

复杂的语法

lisp的语法非常简单.

用lisp写的杀手级应用程序:emacs.Lisp将允许您随意扩展emacs以执行您可以想到的编辑器可能执行的任何操作.

但是,如果你愿意,你应该只学习lisp ,而且你可能永远不会在工作中使用它,但它仍然很棒.

另外,我想补充一点:即使你找到了lisp有意义的地方,你也可能不会说服其他人,它应该用于java,c ++,c#,python,ruby等.

  • 或者更确切地说 - 普通lisp的核心语法很简单.defmacro允许扩展语法,并且一些内置宏(例如defmacro)会变得非常复杂; lambda列表,嵌套反引号等 (3认同)

Chr*_*yer 25

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

  • +1.这个答案应该提到雅虎商店,第一个网络应用程序,部分用lisp编写.引用维基百科:1998年,雅虎!公司以455,000股Yahoo!股票收购Viaweb 股票,价值约4900万美元,并重新命名为雅虎!商店. (2认同)

Joh*_*fle 17

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


Kon*_*lph 9

如果您喜欢编程,您应该学习Lisp以获得纯粹的快乐.XKCD完美地表达了随之而来的智慧启蒙.学习Lisp对于程序员来说是禅修的冥想(我的意思是没有任何亵渎神灵的含义).


Phi*_*ett 9

Lisp对于创建小型DSL非常有用.我在工作中运行的盒子里有一个Lisp的副本,我写了很少的DSL来询问SQL服务器数据库并在C#中生成数据层等.我的所有样板代码现在都是用输出到C#的lisp宏编写的.我用它生成HTML,XML,各种各样的东西.虽然我希望我可以使用Lisp进行日常编码,但Lisp可以带来实际的好处.


Joh*_*fle 5

当一个语言不使用语言的常见缩进约定时,任何语言都会变得更难.当一个人跟随Lisp时,人们会看到它如何很容易地表达语法树结构(注意,这不是很正确,因为预览有点; r应该与递归quicksort参数中的fns对齐):

(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))))))
Run Code Online (Sandbox Code Playgroud)

  • @FerretallicA你在什么基础上确定某些东西是"易于人类阅读"还是"自我描述"?与英语相似?中文"易于人类阅读"吗?数学符号怎么样?它"不易人类阅读"吗?这种说法令人烦恼,因为它的隐藏信息是:"这看起来不像我第一次学会推理的方式." (4认同)
  • 更像你的'反驳'听起来像"Whinge whinge".尝试编程语言嗅探测试.以某人之前没有编程并向他们展示一个VB代码页和一个Lisp代码页.我很乐意打赌我的左手坚果,两个不经意的观察者中的哪一个将更容易从中得出有意义的观察结果. (3认同)
  • 我认为你所说的批评是公平的。我只是想说“它看起来像你展示的那样难,看起来更清晰,因为它在这里展示”。我认为您必须同意,如果不遵循缩进约定,许多语言看起来会更加混乱。此外,如果我们比较 Java 和 Lisp 的缩进,我会说它们通常需要对每种语言的基本结构具有相同水平的知识才能正确缩进。但是,公平地说,虽然完全是主观的,但它看起来仍然很难。 (2认同)

dli*_*sin 5

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


小智 5

八十年代,我在大学里上过“lisp 课”。尽管了解了课堂上提出的所有概念,但我对 lisp 的伟大之处没有任何赞赏。恐怕很多人将 lisp 视为另一种编程语言,这就是多年前大学课程为我所做的。如果您看到有人抱怨 lisp 语法(或缺乏语法),那么他们很有可能就是未能掌握 lisp 伟大之处的人之一。很长一段时间内,我都是这些人中的一员。

直到 20 年后,当我重新点燃了对 lisp 的兴趣时,我才开始“明白”是什么让 lisp 变得有趣——无论如何对我来说。如果您设法学习了 lisp,而不会被闭包和 lisp 宏所震撼,那么您可能已经错过了重点。


J.T*_*ley 5

学习 LISP/Scheme 可能不会给你任何增加的应用空间,但它会帮助你更好地理解函数式编程、它的规则和它的例外。

仅仅为了了解六个嵌套纯函数的美的差异,以及六个带有副作用的嵌套函数的噩梦,就值得花时间投资。


krd*_*zni 5

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

关于 Lisp 的最常重复的神话之一是它已经“死了”。虽然 Common Lisp 确实不像 Visual Basic 或 Java 那样被广泛使用,但将一种继续用于新开发并继续吸引新用户的语言描述为“已死”似乎很奇怪。最近的一些 Lisp 成功案例包括 Paul Graham 的 Viaweb,当雅虎收购他的公司时,它变成了雅虎商店;ITA Software 的机票定价和购物系统 QPX,由在线机票销售商 Orbitz 和其他公司使用;Naughty Dog 为 PlayStation 2、Jak 和 Daxter 开发的游戏,主要用 Naughty Dog 发明的特定领域 Lisp 方言编写,称为 GOAL,其编译器本身是用 Common Lisp 编写的;和 Roomba,自主机器人吸尘器,其软件是用 L 编写的,L 是 Common Lisp 的向下兼容子集。也许更能说明问题的是 Common-Lisp.net 网站的增长,该网站托管开源 Common Lisp 项目,以及过去几年涌现的本地 Lisp 用户组的数量。


eco*_*sis 5

“Lisp 值得学习,因为当你最终掌握它时,你将获得深刻的启蒙体验;这种体验将使你在余下的日子里成为一名更好的程序员,即使你实际上从未经常使用 Lisp 本身。”

——埃里克·S·雷蒙德,《如何成为一名黑客》

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