为什么Lisp不会更普及?[关闭]


50

我开始通过SICP视频学习Scheme,接下来我想转到Common Lisp。

这种语言似乎非常有趣,并且大多数人为此写书都主张它具有无与伦比的表达能力。CL似乎有一个不错的标准库。

为什么Lisp不会更普遍?如果确实如此强大,人们应该到处使用它,但要找到Lisp招聘广告几乎是不可能的。

我希望这不仅是括号,因为一段时间后它们不是一个大问题。



5
钢铁银行(普通)LISP实际上比您想象的要受欢迎。像宏处理器(例如M4)这样的LISP也被广泛使用。您可能不会在选择的域中看到它,但是它仍然存在(无论好坏)。
蒂姆·波斯特

8
最近的地震和海啸摧毁了日本的括号工厂。:-(
oosterwal

1
我们应该使用哪个版本的Lisp?请记住,Lisp方言或多或少是不兼容的。

2
LISP(或的方言)在各处使用,例如AutoLISP是Autocad en.wikipedia.org/wiki/AutoLISP或EMACS en.wikipedia.org/wiki/Emacs_Lisp
Jaydee 2012年

Answers:


68

在公司环境中,表达能力并不总是积极的语言特质。Java之所以非常流行,部分原因是它易于学习,易于编写和易于阅读。平庸的程序员在Java中仍然可以非常高效地工作,即使他们的代码冗长而乏味。

此外,很容易滥用表达语言。熟练的Java程序员可以快速重构不良代码。语言越富表现力,就越难理解和重构可怕的代码。LISP宏就是一个很好的例子。宏是正确的工具。如果使用不当,可能会导致混乱和难以调试的代码。

LISP是高级管理人员的冒险选择。如果出现问题,没有人会指责管理人员选择由甲骨文或微软等大型公司支持的流行的面向对象语言。雇用具有流行,易学的语言经验的程序员要容易得多。

即使是愿意使用功能更强大的语言的进步型公司通常也不会选择LISP。这是因为许多较新的语言都试图通过借鉴LISP的强大功能而妥协,而同时又易于大众学习。Scala和Ruby遵循此模型。糟糕的程序员可以迅速将它们拿起,并继续编写与Java中相同的普通代码。好的程序员可以利用更高级的功能来编写漂亮的代码。

括号不是问题。 Haskell是一种功能强大且具有表现力的语言,其语法类似于Python或Ruby,并且由于与LISP相同的许多原因而未被广泛采用。

尽管如此,我希望...

Clojure有机会变得流行。 它运行在JVM上,与Java互操作性强,并发编程更加简单。这些对许多公司来说都是重要的事情。

*这是我作为专业JVM程序员的观点,具有Java,Clojure,JRuby和Scala的经验。


24
关于找到合格程序员的困难的异议有点像追逐它的尾巴。如果Lisp更加普及,那么找到优秀的程序员将变得更加容易。
安德里亚(Andrea)

2
@Andrea绝对正确。但是,学习Lisp更难,这也导致了问题。我意识到这可能是一个有争议的观点,因为许多教授将计划作为第一语言进行教学。
dbyrne 2011年

8
是的,APL是表达语言的一个很好的例子。另外,一个很好的例子说明了为什么表达能力不是最重要的;)
dbyrne

9
我认为这个定义实际上并不能传达表达的意思。就个人而言,在我将语言称为表达性语言之前,我将确保能够阅读所写内容。例如,在C语言的循环初始化程序中使用非平凡的逻辑可以节省一些代码行,但是这并不容易理解。另一方面,Python中的列表理解可以节省几行内容,并且更具可读性。因此,您实际上找到了一种更简洁表达您的意思的方法。如果无法读取,则根本找不到表达任何内容的方法。
Andrea

3
我想也许我作为一个不喜欢Lisp的人离开。实际上,我喜欢它。Clojure是一种令人难以置信的语言。我认为对于某些类型的公司来说,这是一个非常可行的选择。我只是指出很多公司都没有意义,而使用Scala之类的东西更实用。
dbyrne 2011年

17

为什么Lisp不会更普遍?如果确实如此强大,人们应该遍地使用它,

如果您认为选择语言是因为它们的技术优点,那么您将感到失望。

这些决定是基于脱衣舞娘和牛排。微软可以负担得起。甲骨文可以。Sun花了很多钱来炒作Java,以至于他们破产了。两次。分散的,异构的志愿者社区无法与之竞争。

但是相反,几乎找不到Lisp招聘广告。

有趣的是,Lisp公司的说法恰恰相反:他们不断有工作空缺,但找不到足够的人来填补他们。(这同样适用于Haskell,ML,O'Caml,Forth,Smalltalk等)


3
我住的地方(意大利),我怀疑甚至没有一家Lisp公司存在……
Andrea

1
哪些大型公司在推广Ruby,Python和JavaScript?JS是一个公认的特例,但是在没有大量公司/供应商支持的情况下,另外两个似乎很受欢迎
Ben Hughes

是的,其他语言也是如此。大多数优秀的COBOL编码人员已经拥有工作,并且始终不会阅读广告。为什么要打扰广告?
Bo Persson

到底是什么 尽管Haskell听起来很奇怪,但我将使用非主流语言进行编码。我在其中编写的少量代码非常漂亮,但是如果没有好的指导者,我也不知道何时使用每个Monad和应用函子。
aoeu256

9

我没有在一家真正的公司工作的经验,但是我知道为什么LISP一直难以使用。

首先,这使我想起了这篇博客文章:http : //steve-yegge.blogspot.com/2006/04/lisp-is-not-acceptable-lisp.html

我对Lisp的主要问题是“哪个Lisp”问题。我通常在Linux上作为我的主要平台,但是我所做的事情需要与Windows兼容。这意味着,当我评估要使用的技术时,在两个截然不同的操作系统上工作时,必须使我的生活变得轻松。我不喜欢此要求,但可以在实际的项目中使用它。现在,对于我自己的个人项目,我将使用Windows上没有很好支持的语言,但是由于我没有机会在其中编写大型软件项目,因此我没有必要的经验。

现在,当我尝试学习一种功能语言时,我真的很想学习Common Lisp。这似乎是正确的做法。因为我真的不了解内置函数,并且需要一个在Lisp中进行工作的项目,所以我开始阅读《实用Common Lisp》作为起点。S表达式既美观又轻松。所有这些括号对我来说都是令人难以置信的美丽,因为当天很清楚代码中到底发生了什么。

因此,我尝试在本书之外用Lisp编写我的第一个程序。我想要一个命令行工具,可以对代码行进行计数,并从代码计数中删除琐碎的行。不是最有用的工具,但很有趣。它涉及文件访问,一些解析和计数。大约一周前,我已经在Python中实现了相同的工具。

我需要访问命令行参数。然后,我了解没有获取命令行参数的标准方法。它们都是非标准功能。它根本不是跨平台的。由于该语言没有内置很多库,因此从那里开始大多变得更糟。我最终转到了Haskell,并且对Common Lisp的了解并不多(因此我的投诉甚至可能无效)。

过去,这种非标准的事情一直令我痛苦。C ++也有同样的问题,但是使用Boost等库可以解决这些弱点。

Lisp语法除S表达式外的所有内容也很难看,这也无济于事。


1
PLT球拍(以前称为PLT方案)在Linux和Windows上均运行良好。
拉里·科尔曼

有趣的是,我希望Common Lisp可以比Scheme更加标准和适用于实际应用。(我现在正在阅读实用的Lisp。)
Giorgio

我建议您选择Haskell(我认为这是一种更好的语言),但是Clojure呢?它在JVM上运行,因此它应该是可移植的,并且可以访问您需要的所有库。
安德列斯·F

命令行参数很难在C ++中使用?真?
尼克·基利

构建将Lisp更改为Scheme到Clojure的交叉编译器不是很简单吗?人们为什么不使用它们?
aoeu256

8

IMO,这主要是由于:

  • 库支持差。当然,现在有了Quicklisp,可以很容易地安装库,但是并不能弥补仍然很少的库,而且很多库的文档记录不当或维护得不好。与Python相比,编写非平凡的Lisp应用程序(无论使用哪种方言)很有可能仍会涉及至少重新发明一两个轮子的一部分。
  • 缺乏对开发工具采用的模型的了解。我认识的大多数人都对使用SLIME和Emacs感到非常恐惧,这对于习惯Eclipse和Visual Studio的人们来说是可以理解的。我认为有两个Eclipse插件,几年前我只尝试了其中的一个,这相当麻烦。整个Lisp生态系统看起来像是处于成熟的Lisp运行系统和现代标准oh-it-another-language的一部分之间的一半。学习Lisp不仅限于学习一门新语言-您还需要学习一种完全不同的工作和思维方式,虽然这是一种业余爱好,但还可以,但值得一提的是商业。

不过,情况似乎开始好一些,尤其是随着Clojure的到来。


1
“我认识的大多数人都不得不使用SLIME和Emacs,这对那些习惯Eclipse和Visual Studio的人来说是相当胆怯的。”:我一再感到Lisp是精英人士的感觉。
Giorgio

2
“您还需要学习一种完全不同的工作和思考方式,虽然这是您的业余爱好,但这样做是否值得,在企业中是否值得这样做。”:提高生产率不是吗?足够好的理由?
Giorgio

是否已经证明了这种“生产率提高”?我当然不清楚(是的,我已经用Lisp语言编程)。没有银弹。
尼克·基利

5

我十亿年前在大学里学习过LISP。

LISP和FORTH一样,对于逻辑也很重要。但是大多数编程不是关于逻辑,而是关于以无聊的机械方式操纵数据。例如,当时没有办法右对齐数字输出。

LISP是关于嵌套功能的,人们只是不这么认为。他们从DO A,B,C,D,然后从E的角度考虑。不做A,这涉及到B和C,然后是D和E。这涉及一种令人困惑的并发。除了诸如“提交所得税申报表”之类的预定义任务外,人们不会同时考虑,而是顺序考虑。这就是为什么程序语言在当今占主导地位。

结果,像Java和C这样的程序性代码可以轻松地翻译成英文。LISP代码不能;没有人类的语言以这种方式构成。

因此,这对于解决问题非常有用,但是解决问题在编程中不是很重要。数据输入,验证,输出格式,所有这些LISP都非常薄弱。


7
解决问题是我们所做的一切。在Java或C语言中,操作数据并不容易。在Lisp和其他功能语言中,在cons单元中操作数据要容易得多。对数据的大多数操作是完全相同的,并不关心您按什么顺序处理它们。可以通过调用map和函数指针轻松完成这些操作。我还要说的是,嵌套功能比程序功能更容易思考(因为一个详细说明了您的目标,而另一个详细说明了如何实现所述目标),但是我对此没有证据。无论哪种方式,我都不会说这是不使用LISP的原因。
jsternberg 2011年

4
编程与解决问题有关吗?我不这么认为。顺便说一句,我也不认为你也可以在大学里学习一门语言。
亚当·阿罗德

+1,对于不了解Lisp的我来说听起来很合理。对于企业规模的解决方案,我会说C / Java比Python更好的原因。
乔纳斯·比斯特罗姆

到目前为止,这是唯一提出功能性与过程性的巨大话题的唯一答案,但是请不要忘记,过程性思维倾向于喜欢在vars中修改数据的地方,因为您可以从许多地方接触到线程和线程,从而造成同步问题。功能性不会因此而受苦,编写良好的功能性也不会受苦。
maxpolk

1
一位程序员曾经问过我,使用数据流程图表示for循环的最佳方法是什么。对于这类人而言,非过程语言毫无意义。该思考的FORTRAN。
尼克·基利

5

我认为Lisp尚未提到的一个问题是,对于一个中等或新手程序员(像我一样,我很自由地承认),我很难理解如何将Lisp代码变成一个大型程序。它很容易编写,但很难构造。我认为任何概念都不是特别困难,但是DIY的心态是如此之强,以至于我什至感到迷茫。

使用Java或C#之类的OOP语言,您可以使用类型系统将自己提升为工作模型,并以此为基础。使用Lisp(或Lua或Javascript)时,您会想到可以随心所欲地进行操作。如果要使用OOP,只需创建自己的OOP系统!在获得可用的程序之前,除了编写自己的OOP或学习别人的OOP之外,这是该语言之上的新障碍。另外,我总是觉得Lisp或Lua中的OOP并不真正存在,就像我真的想要的时候可以忽略它一样,那又有什么意义呢?

简而言之,我认为使用Lisp进行编程需要大量的纪律,这很难做到。强类型语言和OOP语言都提供了一种内置的学科,因此程序员可以将有限的精力集中在完成项目上,而无需调整语言。

编辑:打个比方,这让我很震惊,就像您需要做一些木工,两个人为您提供工具箱。一个人的工具有点笨拙,但是基本上可以通过一点努力就可以完成工作。另一个人有很多零件,但希望您可以将这些零件组合在一起,以制造出您将要使用的最佳工具,以最适合您的握柄并达到最佳质量。您只需要先构建它们。


2
至少,Common Lisp明确地是一种OO语言:Common Lisp对象系统是标准的一部分。
Frank Shearar'3

是的,据我了解,这是一种非常强大的功能,但它作为语言的附带功能而传给我。不同于Java,从第一天开始就需要了解对象。实用的Lisp直到第16章才涉及CLOS。尽管我不喜欢动态类型化的语言,但我也许也偏向于静态类型化。 。
CodexArcanum 2011年

Lisp允许您使用闭包(let-over-lambda)代替轻型OOP的对象,但是我相信通过CLOS可以轻松升级以使用OOP。
aoeu256

2

我一直想知道相同的地方,甚至去Lisp会议尝试了解什么是Lisp的“黑暗面”,使每个人都无法采用它。

我没有找到完整的答案。

无知可能是缺少受欢迎程度的原因,但令我更加困扰的是,即使是那些肯定了解Lisp的人(例如Google-Peter Norvig为他们工作)也没有使用它。

我想出的唯一的部分解释是,大多数Lisp伟大的思想现在已经司空见惯,唯一真正重要的缺失思想(一个非常重要的IMO)是元编程的简便性。

不幸的是,我认为没有一种简单的方法可以将这个概念吸收到其他语言中,因为要使元编程更好就需要一种谐音和规则的语言(我说的是通用元编程,而不是笨拙的仅模板版本)。换句话说,它基本上需要使用Lisp语法:代码是数据,数据是代码。用操纵AST的语法丰富的语言编写代码更加困难,因为您需要了解两种语言:如何编写代码和如何编写AST。如果您的AST是固定的,并且由于许多不同的节点类型而又复杂又不规则,则这尤其困难。Lisp具有相当合理的常规(且可扩展!)AST,并且您通常已经可以通过直接编写AST进行编码。

元编程从本质上讲也更加困难(元元编程甚至更多),并且大多数程序员和管理人员显然只喜欢“没人需要”答案。

我感到特别可悲的是,“新”语言(如go最终在需要时使用基于文本的元编程(编写文本文件的外部代码生成器)和“魔术”(即,编译器可以做程序员不能做的)最终结束了。

我认为解决复杂性问题的方法是强大的工具和教育。显然,这种趋势是钝器,不存在这个问题。


+1表示“我认为解决复杂性问题的方法是强大的工具和教育。”
Giorgio

50年后,“无知”的借口
越来越少

1
@NickKeighley:取决于。即使到了今天,大多数程序员实际上对Lisp还是一无所知(例如,大多数时候您会听到Lisp被描述为一种功能语言)。即使在“知道” Lisp的人中,也几乎没有人看到过足够详细的宏概念(我不是在谈论方案的精简版,而是在更合适的情况下具有全功能,并具有准引用的便利性)。
6502

@ 6502:虽然不是纯粹的功能,但IMO Lisp确实比许多主流语言(如C#,Java,C ++等)更好地支持功能编程。对于许多程序员而言,FP意味着不时使用lambda表达式:这些程序员不会错过Lisp或Clojure或Haskell。因此,我要补充一点:(1)Lisp确实很好地支持FP,而功能程序员可以从中受益,但(2)对FP及其优点的了解是不经常使用Lisp的原因之一。
Giorgio

1
@ 6502:将列表作为基本数据结构和列表上常见的高阶函数也是Javascript所缺少的功能。而且,据我所记得,Javascript也具有对偶声明/表达式。我肯定会将Lisp(通用Lisp)放在FP方向上比Javascript或Python再走几步。这样,我并不是说Common Lisp是一种纯粹的功能语言,我同意它是多范式的,但是它比其他多范式语言更好地支持FP。
Giorgio

1

看来,即使CL也没有很好的库支持。至少根据从Lisp切换到Python的人的说法:

http://www.redmountainsw.com/wordpress/archives/reddit-switches-from-lisp-to-python

就我个人而言,我了解一些Scheme并很喜欢使用它,但是无法想象使用该语言进行不平凡的项目。


2
这不再是真的。Quicklisp解决了这个问题。

2
还值得一提的是,使用CFFI,Common Lisp可以使用任何C库。CFFI有据可查,运作良好。另一方面,如果花几个小时为C函数编写包装会对您的项目产生重大影响,那么Lisp可能不是正确的选择。
拉里·科尔曼

我在Scheme中做了一个不平凡的项目,并且知道一家公司将Scheme(Chicken Scheme)用于多种产品。
Giorgio

1

强大不一定意味着广泛使用。您是否听说过“针对常见情况进行优化”一词?不幸的是,正如许多人在平庸之前所说的那样,如果人们始终如一地得到保证,那要比在两者之间有很多失败的大热门要好得多。

Lisp不仅如此,而且许多技术也是如此。与Unix文本处理工具awk,sed,perl的良好结合可以节省您的编程时间。不幸的是,我已经看到人们花几天时间在其他工具中执行此类任务非常糟糕,而在几分钟之内使用这些工具可以更有效地完成这些任务。但是,如果一生都在日食中度过,他将永远不会欣赏这些东西的价值。您可能编写了一个具有可读性和可维护性的大型程序,但是编写这样一个程序而不编写它的全部目的很容易就能完成工作。

如今,在设计工具时的另一个方面是,直接使用工具来解决问题对他们来说是非常有用的。您不能构建太通用的东西,然后说您将通过库和框架对所有这些东西进行套期保值。用这种方法很难解决问题。好的工具可以很好地解决环境和周围的问题。这就是为什么php,perl和awk之类的工具尽管无休止的拖拉和猛击,但仍然保持着相关性的原因,因为它们太有用了,无法丢弃它们,并且它们通常比带有许多库和框架的通用语言还要做很多工作。

同样,您会看到Java / Python之类的语言非常出色,我将对某些任务说得最好。尤其是Python非常好,易于学习和编写。如果您的数据端点是标准的,那么这些语言也确实非常有用。某种数据库或此类XML或数据。基本的结构化数据。

Lisp将会存在很长时间,但不一定广泛存在。正如您将看到的,每种工具都有自己的细分市场。他们可以很好地解决某些问题。我认为并且我确信lisp在其计划可以很好解决的领域和问题上做得很好。


+1是引用“针对常见情况进行优化”的原则。
Giorgio

是的,但是LISP的闭包是针对对象的常见情况的优化。我也想知道是否有人通过将其视为树并像JQuery for HTML一样在其上运行查询来更改其LISP代码库。
aoeu256

1

对于使用Lisp方言进行的Web开发,可能会遇到一些“鸡与蛋”的问题-因为很少有人使用Lisp,主机要么不允许使用Lisp,要么使它变得不容易,并且因为它不容易,所以很少有人用它。但是,实际上,即使在Lisp主机上运行比其现成的PHP服务所需的工作量更多,也可以比您想象的要容易。最近,我花了点力气就让guile Scheme应用程序在这里工作。


0

IMO,这主要是时机不佳的问题:Lisp很老(并且从定义上讲不再令人兴奋)早在对大多数人或用途变得实用之前。Clojure(例如)的机会要大得多。然而,它的成功将更多地取决于被认为是新颖,时尚和酷炫的东西,而不是与Java(以及在JVM上运行的所有其他东西)互操作那样实用的东西。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.