您是否将LISP(的方言)用于实际应用?在哪里,为什么?[关闭]


31

尽管LISP(以及方言,例如Scheme,Common LISP和Clojure)是相当不错的编程语言,但它们并没有获得太多的行业支持。(目前看来,他们正在获得一些吸引力)。

现在,这与问题没有直接关系,您将在生产程序中使用LISP方言吗?什么样的程序,为什么?还包括与其他代码(例如C)集成在一起的用法,但是请注意,这就是您在回答中所要表达的意思。广泛的概念是首选,但具体的应用也很不错。


6
emacs是否算作“现实世界”应用程序? gnu.org/software/emacs/emacs-lisp-intro
美国洛特

1
@ S.Lott:是的。如果使用elisp为Emacs创建扩展名,那很好,并且是LISP方言的应用
Anto

GNU Guile正是用于此目的。

1
尽管很有趣,但我认为这个问题不再适合该网站。多种原因:1-范围太广,2-会列出答案,3-没有明确的方法来确定哪个是“正确的”答案,4-时间太本地化(“没有获得太多的行业支持”), 5-它邀请讨论和辩论。
Andres F.

Answers:


18

您会在生产程序中使用LISP语言吗?

绝对

什么样的程序,为什么?

Lisp是通用动态语言。如今,它具有与Microsoft尚未发布的其他通用动态语言相同的基本困难:本机线程,GUI集成,GC的确定性操作以及较小的内存占用。

我相信,本地线程是通过LispWorks和SBCL实现的。可能是其他人吗?我还没有完全调查。

LispWorks和Franz Common Lisp –商业产品–集成到GUI中达到一定程度的成功。没有$$购买它们,我不知道它的效果如何。我怀疑他们工作得很好...

可以执行确定性的GC操作(在Java中已经完成了一定程度的成功),但是不知道现有的Lisp系统(维护的)是否有任何代码可以执行此操作。

我相信某些Lisps可以实现较小的内存占用。

我的基本观点是,Common Lisp在技术上已经准备好生产系统。它确实

绝大多数开发人员都对动态语言,宏,括号,缺乏喜欢的IDE,缺乏良好的大学经验,没有很多工作,而感到厌倦,然后就不使用它。

我个人希望在团队环境中从头开始在Common Lisp中构建成熟的生产系统。

编辑:我没有真正回答为什么Lisp与其他语言相对。

根据我的Lisp经验-并不重要,但比“ hello world”要多得多-我发现在第一次“精简新语言”苦恼之后,该语言非常有用。大多数语言都以非常规则且相当明显的方式组合在一起,我并没有发现其他语言能像这样进行操作。部分原因是表达式和​​语句的合并。其中一部分是核心列表数据类型。其中一部分是类型系统。其中一部分是宏系统。不过,请不要误会我的意思,这里有很多痛点。但是他们没有像其他语言的痛点那样让我面对。

一个简单的示例是Python的列表长度例程。Python方法是调用len(mysequence)。但是,如果我们考虑一下,则长度是序列的属性。因此,mysequence.len()是一个更合适的想法。Lisp实质上消除了该语法区别。(length thing)是函数调用语法和方法语法。当然,有些人会感到沮丧并想要语法上的差异。我宁愿有规律。

edit2:我将MS论文中在桌面上运行的部分转换为Common Lisp,到目前为止,很高兴能与之合作。


2
据我所知,LISP确实在成熟的生产系统中得到了使用,但通常仅用于某些逻辑处理,该逻辑处理比其他语言更容易用LISP进行编码。视频游戏AI和统计数据预处理是曾经引用给我的示例。我曾经有位经理说过:“任何足够复杂的系统都有内置的半驴LISP实现”。类似的说法是“任何足够肿的系统都有内置的电子邮件阅读器”。
FrustratedWithFormsDesigner

4
@沮丧:是的,那是格林斯潘的第n条定律和jwz的定律。
保罗·内森

2
Clojure解决了许多这些问题,仅因为专门设计为与Java兼容并替代Java即可。但是,当然,也有针对JVM的Scheme和CL实现(例如Kawa,ABCL)。
约尔格W¯¯米塔格

4
Clojure隐约使我烦恼,因为这又是另外一个碎片。
保罗·内森

碎片化不是一件坏事。Clojure中真正令人讨厌的是缺少点对。如果没有这样的基本知识,是否可以将其视为类似于Lisp的语言?
SK-logic

11

我个人知道伦敦的一些投资银行和初创公司以Clojure形式使用Lisp的人。我也选择Clojure作为我自己的创业公司的主要开发语言,所以我愿意把钱花在:-)

我发现在过去的一年中(在Java和C#方面有很多经验之后)学习Clojure是非常令人启发的经历。主要原因是:

  • 它具有相当强的重点放在函数式编程(远远超过其他大多数的Lisp)。作者和BDFL Rich Hickey经常引用Haskell作为其语言设计的灵感之一,这意味着您将获得完全不变的数据结构和惰性无限序列等信息。
  • 宏元编程 -Lisp的“代码就是数据”哲学很难理解,除非您实际体验过,但这是Lisps如此富有表现力和生产力的原因之一。您基本上可以扩展语言以匹配您的问题领域。
  • 多核并发的出色支持-实际上,我认为Clojure是目前并发编程的最佳语言。有关此内容的启发性说明,请参见http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
  • REPL上的交互式开发是一种构建应用程序的好方法。它给您一种真正的力量感觉,可以动态修改正在运行的应用程序代码并以编程方式检查实时数据结构.....

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

  • 通过非常容易的Java互操作性在JVM上运行,使您可以访问Java生态系统中的所有库和工具
  • 您正在JVM上运行,JVM是针对企业应用程序的久经考验的平台。Clojure受益于所有不错的JVM功能,例如免费的出色GC和JIT编译。
  • 默认情况下,它是一种动态语言,几乎不需要任何样板就可以非常方便地进行开发和快速原型制作。但是,您可以添加静态类型提示以在需要的地方获得不错的性能。
  • 这是一个务实且乐于助人的社区 -人们在这里完成工作的一种文化,重点是解决实际问题的精心设计的解决方案
  • 多个IDE中都提供了工具支持。我个人将Eclipse与Counterclockwise插件一起使用(因为我需要Java集成),但是还有很多其他选择。

8

如果它是工作的最佳选择,我将使用LISP。影响“最佳选择”的一些事情:

  • 供应商支持。我们使用的LISP实施-如果出现问题并干扰了我们的开发,进而影响了我们的交货期限,供应商是否会与我们一起寻求解决方案?
  • 图书馆支持。有哪些可用的库?字符串操作,数学,数据访问,Web Servlet(或LISP等效),窗口工具包等...我不想从头开始编写这些东西。
  • 工具支持-IDE有多好?固体/稳定或片状?良好的编辑器支持?集成调试器?如果需要在LISP中进行GUI开发,是否需要可视IDE或必须手工编写GUI布局(我讨厌这样做)。
  • 开发人员支持(我真的不想花太多时间教我的队友一种全新的语言)

在确定LISP是否适合某个项目时,应考虑所有这些因素。在企业界,我从未经历过。


我同意您的看法,生产力通常受可用工具和库的影响大于受语言本身的影响(前提是该语言提供一些基本功能)。
乔治

6

绝对。保罗·格雷厄姆(Paul Graham)很好地解释了这一点

……早在1995年,我们就知道我的竞争对手不了解的东西,甚至到现在都很少有人知道:当您编写只需要在自己的服务器上运行的软件时,就可以使用所需的任何语言。 ..

我们选择了Lisp。一方面,很明显,快速发展对于这个市场至关重要。我们都是从零开始,因此一家可以在竞争对手之前完成新功能的公司将拥有巨大的优势。我们知道Lisp是一种用于快速编写软件的非常好的语言,基于服务器的应用程序会放大快速开发的效果,因为您可以在软件完成后立即发布。

如果其他公司不想使用Lisp,那就更好了。它可能会给我们带来技术优势,我们需要我们所能获得的所有帮助。

因此,您可以说使用Lisp是一个实验。我们的假设是,如果我们使用Lisp编写软件,我们将能够比竞争对手更快地完成功能,并能够在软件中完成他们无法完成的工作。而且由于Lisp的水平很高,我们不需要庞大的开发团队,因此我们的成本会更低。如果是这样,我们可以用更少的钱提供更好的产品,同时仍然可以获利。我们最终将获得所有用户,而竞争对手将一无所有,最终倒闭。无论如何,这就是我们希望发生的事情。

这个实验的结果是什么?令人惊讶的是,它确实有效。我们最终有许多竞争对手,大约有20至30个竞争对手,但是他们的软件都无法与我们竞争。我们有一个所见即所得的在线商店生成器,该生成器在服务器上运行,但感觉像一个桌面应用程序。我们的竞争对手有cgi脚本。而且我们在功能方面始终遥遥领先于它们。有时候,无奈之下,竞争对手会尝试引入我们所没有的功能。但是使用Lisp,我们的开发周期是如此之快,以至于有时我们可以在竞争对手在新闻稿中宣布这一功能的一两天内就复制一个新功能。等到报道新闻稿的记者打电话给我们时,我们也将拥有新功能。

在我们的竞争对手看来,我们似乎拥有某种秘密武器-我们正在解码他们的谜之类的流量。实际上我们确实有一个秘密武器,但是比他们意识到的要简单。没有人向我们泄露其功能的新闻。我们能够以前所未有的速度开发软件...


8
“ ... Paul Graham最初在等待咖啡的时候在餐巾纸的背面写上了一封Lisp字样的reddit,它是如此强大,以至于它必须用python重写,以便普通计算机可以理解。 Paul Graham自己是用Lisp编写的,因此几乎不需要重写整个东西,并且重写是在两个处理器周期之间完成的。 Lisp的早期版本。它是Lisp,Paul Graham,Lisp,Paul Graham,一直下降。”
John Cartwright 2013年

5

其中:Emacs是使用LISP的真实应用程序。

原因:这是表达按键和动作之间映射的好方法。它经过解释,速度快,定义明确,操作简单。


我将通过说出为什么它很好地表达了击球和动作之间的映射来扩展这个答案
Anto

@Anto:根据我的经验,Lisp使得创建强大的抽象变得非常容易,该抽象可以透明地以非常一致的方式表示您可以在编辑器中执行的任何操作-使用Emacs 几秒钟后,您可以猜测几乎可以完成任何操作。这样就可以将您在编辑器中可以执行的任何操作映射到一个按键,每个绑定看起来都非常相似,这使得编写和维护都更加容易。
Tikhon Jelvis,2011年



2

Lisp是实现编译器的最佳选择之一。并且,随着现在DSL和eDSL的使用不断增加,Lisp变得越来越有价值。我正在使用Lisp方言来完成所有与DSL有关的任务。


0

现在,我正在尝试通过Dragonfly框架使用newLisp替代我个人网站上的Php 。如果我能弄清楚如何使Apache发挥出色,我将使用它(内置的Web服务器运行得很好,但我更希望通过Apache进行工作)。一旦发生这种情况,我将在任何会使用Php的地方使用newLisp,因为我不喜欢Php,而我确实喜欢newLisp。

目前,Clojure并不是Android应用程序的不错选择,但我知道人们正在为此努力。因此,如果解决了这个问题,那将是我在实际应用程序中使用Lisp的方言的另一个地方……但这又是因为我只是不喜欢Java。

但老实说,我更喜欢Ruby,而不是Lisp ...,但这主要是社区和文档的问题。


0

我在Common Lisp中实现了一个专有的商业应用程序,名为Tankan,该程序在Microsoft Windows上作为本机可执行文件运行。

这是一个训练自己记住日文汉字字符的程序。

该程序作为后台HTTP服务器运行。我使用Visual C ++开发的一个很小的系统通知区域(又称“托盘”)图标应用程序协调了该服务器的执行和导航至其页面。

微型托盘图标应用程序启动,监视和停止基于Lisp的服务器,并使用与其标准输入和输出绑定的Win32管道与其通信。Lisp服务器通过管道将正确的URL通知给托盘图标应用程序正确的端口号,并且该托盘图标应用程序可以通过Shell API启动浏览器以浏览该URL。用户只需双击图标即可调出用户界面。

Lisp程序在其内存中维护一个相当复杂的会话状态,其中包含用户的输入历史记录以及各种对象之间的各种关系。Lisp的循环对象符号(由*print-circle*变量启用)及其在自定义CLOS print-object方法中的工作方式对实现持久性有巨大帮助:用户可以将状态保存到磁盘并从中断处恢复。一切已保存,包括UI的状态。对象图中有很多共享的子结构,还有循环。另外,许多持久性不需要保留的东西,例如字典条目对象的内容。使用ANSI Common Lisp自定义打印对象方法,您可以为机器可读的对象创建压缩的打印表示,

Web UI中几乎没有使用JavaScript。甚至用于隐藏和显示UI部分的控件都是通过表单提交和重新呈现HTML来完成的。因此,UI状态的每个细节都在服务器中,并在用户保存时保留。HTML的重新生成非常快。这是通过一个巨大的Lisp反引号表达式完成的,该表达式提供了HTML生成宏。Clozure Common Lisp(CCL)编译的代码使此过程如此之快,以至于您几乎不知道,当您单击UI上的[+]按钮打开内容时,您正在向服务器提交请求,该请求会重新生成整个页面,而不仅仅是运行某些本地JavaScript来更改本地文档元素的可见性。

该程序最初是使用CLISP开发的。由于ANSI CL是一种标准语言,其实现具有良好的一致性,并且在该语言中没有太多的陷阱(“未定义”或“实现定义的”行为),因此可以很容易地移植到CCL。

CLISP尚未被放弃。它仍然使用许多相同的通用代码库来为许可后端供电。

我使用IronClad库提供的椭圆曲线加密技术为该程序开发了原始的许可系统,许可服务器使用该椭圆曲线加密对许可进行签名以对其进行认证。(我似乎记得我可能曾经使用过OpenSSL的命令行程序来生成服务器密钥的EC参数。)

许可证表示为Lisp对象。这是对Lisp可移植性的致敬,由Clozure Common Lisp编译的Windows程序可以生成基于S表达式的许可证,在Debian服务器上运行的CLISP程序可以填写该对象中缺少的数字签名字段,然后将其发送回可以验证签名的Windows程序。

在服务器上,除了基于CGI的许可服务之外,我还提供了用于管理许可的简单命令行API。您可以列出许可证,查找特定的许可证并编辑其属性:例如,编辑临时许可证的到期日期以授予用户例外。许可后端也生成电子邮件。我没有在服务器端使用任何库进行CGI处理:只是手动编写了Lisp代码来处理Apache环境变量和命令行参数。(尽管库代码用于处理URL编码和HTML生成。)不使用数据库进行存储;许可证被链接到一个名为的文件licenses.lisp中。


-1

如果有人付钱给我,当然。

他们可能会对付钱给某个懂该语言的人更感兴趣。我只玩过elisp和scheme几次。

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.