it-swarm.cn

LISP在当今世界仍然有用吗?哪个版本最常用?

我尝试每隔一定的时间自学一种新的编程语言。最近,我已经阅读了LISP及其方言在C/C++之类的语言中是如何完全相反的,这使我感到好奇,足以了解更多有关它的信息。但是,我不清楚两件事,我正在寻找有关它们的指导:

  1. LISP是否在当今世界仍在实践/使用,还是像FORTRAN/COBOL这样的传统语言?我的意思是,除了维护现有代码外,它是否还用于新项目?

  2. 什么是最广泛使用的方言?我遇到了Scheme和Common LISP这两种最普遍的方言,并希望您对哪种是最受青睐/最有用的方言发表看法-如果您能为初学者提供任何建议的资源,将不胜感激。

虽然渴望学习一种与我习惯上的程序语言根本不同的语言,但我不想为某种完全过时的东西投入过多的精力-如果它是专业上的“死胡同”,我仍然会学习它,但只有学术角度...

116
TCSGrad

我更喜欢Scheme,如果要使用JVM,则应签出Clojure,这是一种旨在在JVM中工作的LISP。是的,LISP仍然值得学习,以了解这种最小的设计有多么强大!创建LISP的人们确实做对了一些事情。令人惊讶的是,LISP在1960年代拥有许多现代语言的超酷新功能!

对于嵌入式方案,请尝试使用guile: http://www.gnu.org/s/guile/

59
Zachary K

在回答问题2“最广泛使用的方言”时:

取决于您如何解释“最广泛使用”。以下是有关下界的一些餐巾纸数学,涉及几种选定方言中每种方言的使用量。

大多数原始代码编写

  • 可能由于 受教育 应用而计划(所有方言)
    • 270所学校...让我们猜想50名学生/年,500行代码/学生,运行10年。 1,000,000+行基于餐巾纸数学。
    • 球拍本身及其工具中有50万行球拍。
  • 由于 [〜#〜] ai [〜#〜] 以及大量开放源代码和生产代码(请参见生产代码),可能是常见的LISP。
  • 可能是Emacs LISP,因为...
    • Emacs本身: 超过1,000,000行
    • 公开编写的emacs LISP数量-237个模块,大约200行/模块,仅在EmacsWiki上的40,000 +行,在ELPA中可能更多
    • 加上以emacs LISP,.emacs文件等编写的应用程序。
  • Clojure
    • 难以估计。主要是较小的网络通信。可能很多。

优胜者:Scheme或Common LISP。未知数太多

大多数“生产”代码

赢家:我猜是Common LISP。我认为基于Common LISP和Clojure的使用,我们可以对问题1回答“是”。

大多数最终用户

  • 普通LISP
    • ITA软件的客户,包括Orbitz,Bing Travel和Kayak.com-可能有数百万。
  • Clojure
    • 花旗银行(无详细信息),Akamai(无详细信息),simple.com,还有许多其他内容。可能数以百万计。
  • 方案
    • CS学生,研究人员和业余爱好者。不到十亿美元。
    • 未知系列- 超过500万
  • Emacs LISP-大多数是程序员,主要是在unix平台上。可能是一百万。

优胜者:Scheme在这里具有最好的下限,因为《神秘海域》上有销售数字,但这是值得商de的。

结论

总之,我发现那个大苹果。

68
Jesse Millikan

LISP是否在当今世界仍在实践/使用,还是传统语言

是的,是的,但是您必须知道在哪里看。使用LISP的人并不太会大声喊着它,但是在过去20年中,有少数几个著名的初创公司使用LISP产生巨大影响的例子。它在欧洲的小公司中也很受欢迎。

什么是最广泛使用的方言?

这是一个有效的问题,但这不是一个容易回答的问题。它可能也不是一个特别有用的答案:许多实现都有特定的重点,因此,如果它们适合您的特定问题,则最好选择它们,而不是根据它的使用范围来选择。相反,我会告诉您一些有关您的选择的信息,您可以自己决定。

LISP是一种语言家族,每种语言都有一系列方言和实现。方言大致分为“ LISPs”和“ Schemes”两个阵营。

LISP:直到最近,Common LISP才是王者。这是试图统一所有不同的LISP,而又毫不客气地是LISP的“ C++”。也就是说,这是一种[〜#〜] huge [〜#〜]语言。它拥有一切。在过去的几年中,Clojure出现了。 Clojure是一种LISP,它在Java)虚拟机上运行,​​并试图根植于功能编程哲学中。)传统上,其他LISP严格来说是多范式。Clojure很有趣,因为它同时获得了无论是LISP还是JVM,都是非常好的和非常糟糕的。基于Java的语言仍然有很多冗长的细节,它们在语法上相当自由和容易,因此有很多旋钮和按钮可用于处理不同的事物,但是它们关于数据类型,有一些真的有趣的想法,尤其是他们提出的一些实用方法来应用函数式编程的想法。

方案:方案是LISP的严格子集。该方案是由Steele和Sussman发明的,早年在MIT计算101讲义课程)中使用。该方案在“关于算法语言方案(RnRS)的修订报告中进行了定义。 )”。是的:他们在讲数学笑话。Scheme是其他LISP所不具备的一种标准化语言。这极大地有助于了实现之间的可移植性,但这不是灵丹妙药。标准化工作一直很保守。实施方面的创新(尤其是围绕模块之类的创新)往往相去甚远,还有一系列SRFI(实施方案请求),类似于IETF的RFC流程,人们可以根据需要使用它来标准化小事物。

方案与LISP的不同之处在于,它们具有一组必须满足的硬性要求,其中之一是“尾部调用优化”,这有助于提高递归效率。因此,Scheme中的递归编程风格比LISP中的流行得多。同样,方案也很像LISP的“ C”。也就是说,这是一种小语言,您应该能够一次将所有这些保存在脑海中。

当前有两个Scheme系列:基于第5版(R5RS)的和基于6版(R6RS)的。 R6RS的复杂性远高于其任何前任产品,因此许多R5RS实现选择跳过它,希望R7RS与R5RS相比将更类似于R5RS。 R7RS标准化过程目前正在进行中,它试图通过在第一个工作组中标准化一种小的基本语言,然后委托第二个工作组来标准化更大的功能,从而既包括R5RS实现者的需求,也包括R6RS民间的需求。这将使该语言在微型嵌入式硬件以及功能更强大的计算机上都具有高效且有用的实现。

现在我将更具体:

PicoLisp是一个非常非常酷的LISP。很小!它是作者自己写的,据我了解,自1980年代以来,他一直以此为生。如果您有机会参加他的演讲,那么您应该这样做:他非常有趣,并且非常了解他的东西,即使是主流或无聊的事情,您也不会闻到任何细小的嗅探。

我不熟悉Common LISP的实现,因此我将不对其进行进一步评论。

Guile是官方GNU方案。

Racket是一种R6RS方案,但最近它似乎扩大了网络,并正在尝试“充当语言创建,设计和实现的平台”。

鸡肉的目标是成为一个实用的计划。它基于R5RS并编译为C。事实证明这是一个非常重要的优势,因为它使使用现有C库绝对不容易。因此,Chicken可能是替代Perl,Python,Ruby等作为您日常脚本语言的最有用的方案。几年来,有一些人专门将其用于所有需求。它有一个交互式REPL以及一个编译器。该社区(在邮件列表和IRC上))知识丰富,友好而乐于助人。

寻找具有许多模块的实现:这表明它是广泛可用的,这意味着它可能具有有助于完成当前任务的功能。

寻找使用编译器的实现,或者至少使用不严格基于IDE或REPL=。)的实现。教学很难用于通用脚本。

我会推荐鸡肉,因为那是我用的。我已经在个人项目中使用了它,并且已经专业地(并且目前正在使用)它。

如果某个东西完全过时,我不想投入过多的精力-如果它是专业上的“死者”,我仍然会学习它,而只是从学术角度考虑...

Scheme在专业上并没有死,但是您可能需要花些时间才能在这种情况下使用它。像Chicken这样的东西远不止是学术上的追求,它可以轻松涵盖您当前使用的任何高级语言的几乎所有基础。

43
andyjpb

不能真正代表所有Lisps说话,但Clojure绝对是目前热门且相关的语言。我本周早些时候去的伦敦Clojure用户组有100多名与会者。

我发现在过去的一年中(在使用Java和C#)积累了很多经验之后),以Clojure的形式学习LISP是非常令人启发的经历。主要原因如下:

  • 它非常强调函数式编程(比大多数其他Lisps还要多)。作者和BDFL Rich Hickey经常引用Haskell作为他的语言设计灵感之一,这意味着您将获得诸如完全不变的数据结构和惰性无限序列等信息。
  • 宏元编程-除非您实际经历过,否则LISP的“代码就是数据”哲学很难理解,但这是Lisps如此富有表现力和生产力的原因之一
  • 多核并发的出色支持-我实际上认为Clojure是最好的目前用于并发编程的语言。请参阅 http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey ,以获得有关此内容的启发性演示

由于以下原因,这似乎也是实际生产中的实际选择:

  • 非常轻松地在JVM上运行Java互操作性使您可以访问Java生态系统中的所有库和工具
  • 默认情况下,它是动态语言,这使得开发和使用几乎没有样板的快速原型变得非常方便。但是,您可以添加静态类型提示以在需要的地方获得不错的性能。

我个人知道有人在多家投资银行和初创公司中使用Clojure。我还选择Clojure作为我自己的创业公司的主要开发语言,所以我愿意把钱花在:-)

27
mikera

我目前也在学习LISP(而且我很喜欢)。我使用的是Common LISP,但我也弄乱了 [〜#〜] sbcl [〜#〜]Arc (请注意,这是Paul Graham的LISP版本,如Vitor Braga所述,创建了Yahoo store/Viaweb)和 Allegro CL ,这类似于Visual Studio for LISP(可以创建GUI,但是我从未使用过)。

至于用途,LISP在人工智能中已被大量使用,但是老实说,我不确定LISP还有多少其他“通用”用途。 LISP内置的许多网站最初都是用其他语言重写的,因此很难说它已用于Web开发中(不是说它不是,但是使用它的较大型站点不再这样做了) )。经过快速搜索(非常快速)之后,下面是用 Wikipedia 用Common LISP编写的软件列表。

[EDIT]至于专业使用LISP,有一些工作可以让您使用LISP。它们不如Java或C#职位),但它们存在。我认为LISP是用于内部应用程序的那些语言之一,可能会提供公司所没有的竞争优势。我不想通过广告宣传他们使用LISP来放弃。我记得在P.SE上看到过一篇帖子,指出Smalltalk在金融领域也是如此。

同样,即使您在工作中不使用LISP,也能够证明您能够学习不同的范例,这可以打开更多的大门。

“ LISP值得您学习,当您最终获得它时将拥有深厚的启蒙经验;即使您从未真正使用过LISP本身,该经验也将使您在余下的时间里成为一个更好的程序员。” -埃里克·雷蒙德(Eric Raymond),“如何成为黑客”

[/编辑]

9
Jetti

如果您想今天学习LISP,我可以看看球拍,它是一种快速的方案实现(嗯,它实际上与方案有些偏离,所以现在是它自己的方言)或clojure,它们可以从它运行在JVM上(因此可以使用成千上万的库,此外,您还可以使其与您自己的Java代码)进行交互。

即使您不学习它的实际使用方法,学习它也总是有益的:一旦您将思想围绕LISP了一段时间,就可以学习思考和处理问题的新方法,甚至使用其他语言。

8
Fabien

Amazon后端的很大一部分曾经使用LISP,但现在已用C++重写,所以我听说(我必须承认我对此没有可靠的来源)。

雅虎!商店是LISP Web应用程序的经典示例之一。来自Yahoo!储存您可能听说过的知名度 Paul Graham 。 Graham是最知名的LISP倡导者之一,并撰写了大量有关此主题的文章。您可能想阅读他的站点以了解他的观点。

AutoCAD过去在其宏系统中使用LISP语言。我不知道它是否仍然如此。

Scheme是一种简洁的语言,非常优雅。它可能是我最喜欢的编程语言,所以我可能会有所偏见。如果我现在要编写一个主要的应用程序,我可能会用C编写一个框架应用程序,并在Scheme中扩展和定义业务规则。这使我可以使用Scheme并利用C-来提高速度,并提高几乎所有库的可用性。

7
Vitor Py

LISP是否在当今世界仍在实践/使用,还是像FORTRAN/COBOL这样的传统语言?我的意思是,除了维护现有代码外,它是否还用于新项目?

我认识几个在硅谷的一些初创公司中从事Lisps的人,而且我知道Amazon.com从一开始就一直在使用LISP(尽管我听说他们出于某种原因将其替换为C++?)

但是,一个值得关注的公司是 Naughty Dog 。他们所有的游戏都是用LISP方言编写的。最初,他们自己滚动,但在《神秘海域》系列中使用MZScheme。

什么是最广泛使用的方言?我遇到了Scheme和Common LISP这两种最普遍的方言,并希望您对哪种是最受青睐/最有用的方言发表看法-如果您能为初学者提供任何建议的资源,将不胜感激。

我敢说Common LISP,Clojure,Scheme和Emacs LISP是使用最广泛的四种方言,其中我怀疑Scheme是最常用的方言。当然,我没有任何要支持的内容。 :)

我宁愿像其他人所建议的那样喜欢SICP和Little Schemer,但是我也建议 LISP的土地 ,这是一个很有趣的读物。 :)

4
greyfade

我认为这部分取决于您要使用它的方式-如果您想进一步了解各种编程概念,并使自己成为更好的程序员,那么我想值得至少学习一点LISP。如果您正在寻找另一种要添加到简历中的语言,以期寻求使用该语言的工作,那么您可能想在其他地方查找。没有那么多LISP作业。

我个人尝试使用SBCL或更新版本的Clojure(以及一些Emacs LISP,但是使用htat是因为我是Emacs的长期用户-当我尝试学习LISP时,我将尝试学习Emacs LISP)。现在我所要做的就是找到时间真正使用这些语言。

2
Timo Geusch

我不知道LISP中有很多工作,我当然看不到。但是我确实记得很长一段时间读过一些有关NASA探测器的信息,这些探测器在其中运行LISP并能够从地球插入新代码。

同样在纽约,clojure聚会组织也很庞大。我猜想,如果您有兴趣并去参加Clojure聚会小组,您可能会找到交流机会并找到工作(不是Clojure工作,而是Java/C++ /等东西)的机会。纽约地区似乎绝对是巨大的,其他地区可能有所不同。

LISP也是一种不同的思维方式。另外,LISP和SQL都导致使用大量嵌套表达式。我大量使用SQL,然后注意到LISP更有意义。但是,如果您在使用LISP时遇到SQL习惯于超级嵌套括号和表达式的麻烦,则可能会使SQL表达式更容易找出。

一个经典的例子是如何实现MAX(a,b,c)。您可以使用一堆if语句来制作卷积函数。或者你可以说

MAX(MAX(a,b),c)

并使用两个MAX的两个简单的嵌套调用,对我来说,这更容易阅读。尽管如果性能是一个问题,您可能也想换一种方式,但是在使用每种方法时,我都不必费心计算比较次数...同样,如果您是通过C宏或其他评估结果的方法来实现MAX的,表达式多次可能无法获得预期的结果,因为表达式可能会被多次评估,因此请注意副作用...

2
Cervo

另外两点:

首先,LISP是一种很棒的语言,用于编写代码,其中功能或数据之间的交互通常很复杂。在许多流行的语言中,如果您对程序为何要执行的操作感到困惑,则必须编写特殊的函数来检查程序的内部状态。在某些语言中,则必须等待代码重新编译。当然,可能会有诸如调试器之类的工具对此提供帮助。但是,在LISP中,您所需要的只是一种停止程序的方法,然后通常可以访问LISP中的一切。在Common LISP中,有时我只键入^ C,或将error的调用扔到一个函数中(这是唯一必须重新编译的东西,您无需执行任何操作即可重新编译它) 。停止程序后,我立即被投入调试器中,但是调试器为我提供了LISP的全部功能,并且我可以退出调试器,调用特定的函数等。我可以轻松地检查任何数据结构在我的程序中。大多数计划应允许类似的做法。 LISP在这方面不是唯一的,但它提供的功能超出了许多流行语言提供的功能。

第二:如果您要尝试使用LISP的任何方言,那么在没有(a)使用匹配括号的编辑器以及(b)学习正确的LISP缩进的情况下,我不会这么做。使用一个也可以为您近似缩进的编辑器是一个好主意。 C/C++/Java样式的代码格式设计用于比LISP括号/花括号/括号少的语言。 LISP漂亮的打印样式一旦您熟悉就可以很好地工作,并且不会因括号而感到困惑,也不会浪费您一半的空间,而每行只用一个括号括起来。

2
Mars

我想添加一些有关Common LISP和Scheme的观点。由于JVM,我避免了Clojure,所以对此我没有太多的看法。

Scheme是一种简洁明了,定义明确的语言。由于遗留问题,CL不得不做出很多决定,并且采取了更为纯粹的方法。例如,变量和函数在同一名称空间中。默认语言更小,更简洁,非常适合教您LISP擅长的事情,例如,它要求递归使用而不是迭代,因为默认情况下它没有迭代循环,并且需要进行尾部调用优化。 Scheme有一个非常有趣的卫生宏系统,对学习有很大的价值。但是IMO,我建议您首先学习CL风格的Unhygienic宏,即使不是规范的一部分,大多数(?)方案方言也可以提供其中至少一种实现。由于似乎很想学习一种语言来学习,所以我建议使用Scheme,因为除此之外,它的许多概念很容易转换为其他形式和一般的动态语言。

话虽这么说,Scheme的社区是零散的,除了几个小口袋以外,似乎主要致力于完成实际工作的研究……例如,每个方言都有自己的软件包管理器,并且软件包通常不可移植跨方言,这在计划社区中是一个巨大的问题。

另一方面,常见的LISP似乎是开发一种语言更为实用的方法。该标准使得许多LISP代码在实现之间可移植,许多编译器都经过快速优化。有很多软件包,其中许多在实现之间可移植。似乎(相对)大量的实际产品正在用该语言创建。借助quicklisp,它的包管理感觉与您在诸如Ruby或Node这样的现代社区中所获得的东西相当接近。但是,CL并非没有缺陷,与方案相比,它在这一点上具有很大的规格,甚至它的对象系统CLOS(传统上用Lisps编写为库)也是IIRC规格的一部分。您会感觉到遗产在整个系统中根深蒂固。例如,提取用于编译的图像的标准构建系统方法让人感觉有些奥秘。

否则,我说我不会讲Clojure,如果您的目标是编写Emacs扩展,则Emacs LISP显然是适当的选择,而显然不是其他软件的适当选择。

TLDR;如果您的目标是学习,我建议您使用Scheme。但是,如果要创建软件,我建议使用两种主要LISP变体中的Common LISP。

1
Arelius

现在,我得到的印象是LISP主要用于咨询店(而不是咨询店主要使用它)。

对于实用软件来说,它有点过分。我相信,主要是因为人们不习惯。

传统上,Scheme是LISP的一种学术方言,而Common LISP是行业的方言。

LISP对于符号操作和反射式功能特别有用。

例如,我编写的用于学习LISP的代码是一个程序,该程序构造随机lambda函数,对其进行评估,然后对其进行操作,以最大程度地减少与目标函数之间的差异。所有这些都是直接操纵。使用C++或Java这样的语言,我将不得不为计算机可以操纵的功能发明一种表示形式。

1
Paul Nathan

选择学习LISP的方言时要考虑的另一个因素可能是实现的数量和质量。如果一种方言只有一个或两个实现,那么您将被困在它们的缺陷中,直到这些缺陷被修复为止,而且人们总是有机会停止完善实现。就其本身而言,这不是不使用LISP的单一实现方言的理由,但这是需要考虑的事项。 Scheme和Common LISP的优点是这些方言有许多实现。两种语言都已经发布了标准,因此相对较新的实现大多数都可能运行相同的代码。这些实现中的一些已经存在很长时间了,但是仍处于积极开发中:它们现在是高质量的实现,并且仍在完善中。 (例如,上面提到的Steel Bank Common LISP(SBCL)非常快。我想知道使基于JVM的LISP变得如此快会多么容易。)

0
Mars

我从答案中学到了很多。感谢所有为这次启发性对话做出贡献的人。

我应该提到 newLISP 。尽管它与CL和Scheme有所不同,但它实现了许多非常有用的功能。我发现http服务器,多处理功能(Cilk)和远程评估功能非常干净并且易于使用。

单个可执行文件体积小,速度快,并且包含大量电池。

0
CyberFonic