这些天学习LISP有用吗?

时间:2009-10-23 17:02:02

标签: lisp

我前几天在车库出售时拿到了一本LISP书,只是想知道是否值得花一些时间。

14 个答案:

答案 0 :(得分:30)

是。我会坚持使用Common Lisp,虽然Scheme也是一种极好的语言,有很多值得推荐的。

在Common Lisp中,你有一个较大的多范式语言,它提供了一些在Lisp语言系列之外不存在的东西,或仅限于CL和更加模糊/小众语言的东西。

第一个功能,你可以通过CL,Scheme和其他一些方言以某种方式获得,是一个真正的宏系统。

我说“真实”,因为系统比C预处理器宏更加完整,灵活和可靠。要让CPP宏以可靠的方式处理简单的事情(比如交换两个变量的值,或者构建一个foreach构造),这是非常困难的,但这对于Lisp宏来说是微不足道的。这是一个非常强大的工具,用于引入新的抽象并省去“样板代码”。

第二个功能,实际上仅限于Common Lisp,是CLOS,即Common Lisp对象系统。尽管有这个名字,但它并不像Java那样传统的OO系统,方法是类定义的一部分。相反,它通过“泛型函数”提供多态性,这些函数附加到哪些方法,默认情况下允许您进行多次调度。

我非常喜欢CLOS到更常用的面向对象方法,因为它使得许多“模式”(如访问者模式)完全不必要,并且因为现有泛型函数的扩展非常容易;其他人厌恶它,因为它需要一种极其狡猾的封装方法,因为通用功能的扩展可以说是容易。无论哪种方式,CLOS都是不同的,我认为仅仅因为它所提供的不同视角而值得学习。

第三个功能,可以在Lisp之外使用,但如果你以前从未体验过它仍然很棒,那就是动态的交互式编程。 CL调试器往往是非常强大的工具,CL提供动态定义和重新定义函数,类和方法,所有这些都极大地提高了一个人探索问题的能力,测试了该问题的解决方案及其子问题,最后整合了一个正确有效的程序。

最后,对于很多类问题,Lisp是一种很棒的实用语言。它提供了良好的性能(通常不如C快,但比大多数“脚本语言”快得多),安全性,自动内存管理,功能的标准库和容易扩展的巨大机会。

答案 1 :(得分:14)

值得学习“扩展思维”的目的,但这些天建立应用程序并不那么受欢迎。

然而,它功能强大且成熟,并且有快速和免费的编译器。因此,如果您愿意,没有理由不为程序选择它。

Lisp处理数据结构和程序结构的方式同样提供了值得理解的惊人功能。

它的历史令人着迷,它塑造了计算机科学的世界。

请务必在麻省理工学院开放式课程中查看Ableson和Sussman的Structure and Interpretation of Computer Programs

Clojure: a Lisp on .NET and Java VMs

GNU CLISP.

CMU Common Lisp

答案 2 :(得分:12)

取决于这本书。哪本书?

Common Lisp今天值得学习,因为它是为数不多“完成所有事情”的少数几种语言之一。如果有一些主流或模糊的编程习惯或技术,可能是Common Lisp已经以某种形式存在。关于CL缺乏的唯一内容是延续(许多人认为它不需要它们,但是如果你想探索它们则没有用。)

任何花时间在Common Lisp上写作的人都会以某种方式改变,通常是为了更好,恕我直言。

即使你不能将你学习和使用的所有Lispy概念都带到其他环境中,了解它们以及它们如何工作仍然有用。

答案 3 :(得分:9)

优秀的程序员可以尽可能多地使用不同的编程范例 - 而不是尽可能多的编程语言。

LISP家族(有几种变体)非常值得了解。你的目标应该是围绕函数式编程和lambda演算 - 这是LISP所依据的范例。专注于成为“王牌”LISP程序员(可能需要数年时间)。

如果您发现函数式编程“翻转您的开关”,请尝试查看PROLOG - 这里的范例是基于对Horn子句(谓词逻辑)的评估。

我可能已经花了20年的时间作为COBOL程序员(OMG - 他们仍然有那些!),但我认为我是一个更好的程序员,因为花时间学习LISP和其他一些编程语言真的很重要。

爆炸......

答案 4 :(得分:8)

这是Google Tech的一次演讲,值得关注一家目前为Common Lisp航空业生产大型复杂软件的公司:

Lisp for High-Performance Transaction Processing (视频现已无法播放。Here是Zach Beane的一些注意事项。)

该视频中提到了其他主题,包括Clojure,一个用于JVM的Lisp的新变种(现在正在开发一些工作来为CLR开发Clojure,但这不是很远),值得检查它解决并发问题的方式。请访问Clojure网站:

http://clojure.org/

并且,特别是首先,请查看该页面右上角的链接,查看一些优秀的Screencast,其中包含并发问题和Clojure功能的概述。

如果你对Lisp感兴趣,那么你发现的那本书并不是那么好(我自己有一本老书对我来说没什么用),Paul Graham的书 On Lisp 可用在http://www.paulgraham.com/onlisp.html免费,非常好。对于Common Lisp或Scheme或Emacs Lisp或Clojure,一般的Lisp思想是相同的,但具体情况会有所不同 - 所以如果阅读Graham的书,请记住这一点,该书主要关注Common Lisp(有些提及Scheme特性)。 On Lisp 可能不是最好的初学者书,但值得仔细阅读并略过具体内容,你还没有准备好详细关注,看看有什么,特别是关于宏,其中 On Lisp 真正探索过。

答案 5 :(得分:4)

请参阅this问题,尤其是第三个答案,即解释Lisp有助于解决复杂问题的问题,那些难以分解为更易于管理的模块的问题,如果您尝试在另一种语言。换句话说,如果你热衷于探索解决复杂问题的方法,那就是自然语言处理或知识聚合...那么,是的,Lisp可能只对你有用。

答案 6 :(得分:4)

了解lisp以了解宏,并且该代码是数据,并了解您可以通过C ++的自我鞭挞来达到启发。

学习Common Lisp以了解读者宏和编译器宏。我不知道有任何其他语言。

学习延续计划。

学习Clojure,因为它会使Java过时: - )

答案 7 :(得分:4)

Lisp的一个好处是你对前缀表示赞赏并想知道为什么世界上其他人也不会使用它(比如使用Latexvim

+ 1 2 3 4 5 6 7 8 9

更容易编码/编辑/粘贴
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9

答案 8 :(得分:2)

它(Common Lisp)仍然被从事人工智能工作的学者大量使用。 Scheme是一种类似Lisp的语言,也被许多(大多数?)CS部门使用。我个人认为学习Lisp是值得的,无论你是否最终使用它。这是一种经典语言,我们从一段时间内学到了很多东西。

答案 9 :(得分:2)

学习LISP是有效学习函数式编程的好方法,通常用作本科生的入门语言。许多人认为使用Lisp的Scheme方言的Structure and Interpretation of Computer Programs是一本应该放在每个程序员架子上的书。

保罗·格雷厄姆一直是Lisp的big proponent,在他的书Hackers and Painters中,他描述了他如何利用Lisp的力量来主导竞争,为雅虎商店创建ViaWeb。

在其他地方,我看到Lisp方言在航空航天业中占据突出地位,作为CometAML等集成框架的脚本工具。 Lisp将永远与20世纪50年代早期的AI实验联系在一起。

答案 10 :(得分:2)

正如其他人所提到的,Lisp对于一般编程来说不再流行了,它肯定(IMO)在编写真实系统方面存在一些主要问题,但当然其他人不同意(例如ITA的大部分软件都是写的)在Lisp中,他们制造疯狂的银行。)

即使你从未在Lisp中编写“真正的”程序,也绝对值得学习。有许多最初在Lisp中开创的编程技术,知道它们,将帮助您在Python,Perl,Ruby,ML,Haskell甚至C ++中编写更好的代码。例如,查看Higher Order Perl,其中显示了如何在Perl中执行各种惊人的技巧;引用引言“我不会告诉你Lisp是多么美妙,我会告诉你Perl有多棒,最后你不必知道任何Lisp,但你会对Perl有更多的了解。[...然后你可以停止在Perl中编写C程序。我认为你会发现它是一个很好的改变.Perl在Perl方面比在C语言的慢速版本中要好得多。“

并且有一些很棒的书籍使用Lisp,如果你知道语言会更容易理解它们--SICP,Norvig的Paradigms of Artificial Intelligence ProgrammingThe Reasoned Schemer都会想到-reads。

答案 11 :(得分:2)

这里的一些人推荐Clojure。虽然我会说Lisp一般都很好,但我会提醒Clojure,至少对于初学者来说。使用Clojure并没有任何困难,只是因为Clojure与Common Lisp和Scheme完全不一致。如果你想要JVM集成,请使用Armed Bear Common Lisp:https://common-lisp.net/project/armedbear/,但是对于一般用途,我会推荐Steel Bank Common Lisp:http://www.sbcl.org/

答案 12 :(得分:1)

这就像质疑“这些日子的网络编程是否值得学习?”。只有你可以决定它是否值得。你要问自己的是:我想读什么书?

学习新语言有时在实用意义上没有用(也许你不会在生活中使用LISP),但从长远来看,它会因为你不熟悉的不同范例所获得的知识是有用的 - 你可以使用你今天已经使用的一些知识。

答案 13 :(得分:1)

从大学开始已经有一段时间了,但在我修读了第三年的CS课程后,需要学习Lisp并编写Lisp程序,递归写作和思考是一件轻而易举的事。并不是说我在课程之前有递归的问题,但之后,这是第二天性。我也在课程(多伦多大学)中使用了CLOS,但是很久以前,我几乎不记得我做了什么。