尽管LISP(以及方言,例如Scheme,Common LISP和Clojure)是相当不错的编程语言,但它们并没有获得太多的行业支持。(目前看来,他们正在获得一些吸引力)。
现在,这与问题没有直接关系,您将在生产程序中使用LISP方言吗?什么样的程序,为什么?还包括与其他代码(例如C)集成在一起的用法,但是请注意,这就是您在回答中所要表达的意思。广泛的概念是首选,但具体的应用也很不错。
尽管LISP(以及方言,例如Scheme,Common LISP和Clojure)是相当不错的编程语言,但它们并没有获得太多的行业支持。(目前看来,他们正在获得一些吸引力)。
现在,这与问题没有直接关系,您将在生产程序中使用LISP方言吗?什么样的程序,为什么?还包括与其他代码(例如C)集成在一起的用法,但是请注意,这就是您在回答中所要表达的意思。广泛的概念是首选,但具体的应用也很不错。
Answers:
您会在生产程序中使用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,到目前为止,很高兴能与之合作。
我个人知道伦敦的一些投资银行和初创公司以Clojure形式使用Lisp的人。我也选择Clojure作为我自己的创业公司的主要开发语言,所以我愿意把钱花在:-)
我发现在过去的一年中(在Java和C#方面有很多经验之后)学习Clojure是非常令人启发的经历。主要原因是:
由于以下原因,这似乎也是实际生产中的实际选择:
如果它是工作的最佳选择,我将使用LISP。影响“最佳选择”的一些事情:
在确定LISP是否适合某个项目时,应考虑所有这些因素。在企业界,我从未经历过。
绝对。保罗·格雷厄姆(Paul Graham)很好地解释了这一点。
……早在1995年,我们就知道我的竞争对手不了解的东西,甚至到现在都很少有人知道:当您编写只需要在自己的服务器上运行的软件时,就可以使用所需的任何语言。 ..
我们选择了Lisp。一方面,很明显,快速发展对于这个市场至关重要。我们都是从零开始,因此一家可以在竞争对手之前完成新功能的公司将拥有巨大的优势。我们知道Lisp是一种用于快速编写软件的非常好的语言,基于服务器的应用程序会放大快速开发的效果,因为您可以在软件完成后立即发布。
如果其他公司不想使用Lisp,那就更好了。它可能会给我们带来技术优势,我们需要我们所能获得的所有帮助。
因此,您可以说使用Lisp是一个实验。我们的假设是,如果我们使用Lisp编写软件,我们将能够比竞争对手更快地完成功能,并能够在软件中完成他们无法完成的工作。而且由于Lisp的水平很高,我们不需要庞大的开发团队,因此我们的成本会更低。如果是这样,我们可以用更少的钱提供更好的产品,同时仍然可以获利。我们最终将获得所有用户,而竞争对手将一无所有,最终倒闭。无论如何,这就是我们希望发生的事情。
这个实验的结果是什么?令人惊讶的是,它确实有效。我们最终有许多竞争对手,大约有20至30个竞争对手,但是他们的软件都无法与我们竞争。我们有一个所见即所得的在线商店生成器,该生成器在服务器上运行,但感觉像一个桌面应用程序。我们的竞争对手有cgi脚本。而且我们在功能方面始终遥遥领先于它们。有时候,无奈之下,竞争对手会尝试引入我们所没有的功能。但是使用Lisp,我们的开发周期是如此之快,以至于有时我们可以在竞争对手在新闻稿中宣布这一功能的一两天内就复制一个新功能。等到报道新闻稿的记者打电话给我们时,我们也将拥有新功能。
在我们的竞争对手看来,我们似乎拥有某种秘密武器-我们正在解码他们的谜之类的流量。实际上我们确实有一个秘密武器,但是比他们意识到的要简单。没有人向我们泄露其功能的新闻。我们能够以前所未有的速度开发软件...
其中:Emacs是使用LISP的真实应用程序。
原因:这是表达按键和动作之间映射的好方法。它经过解释,速度快,定义明确,操作简单。
绝对会考虑的。特别是对于具有并行计算潜力的新开发工作。对于这些类型的功能语言,这似乎是一个最佳选择。
现在,我正在尝试通过Dragonfly框架使用newLisp替代我个人网站上的Php 。如果我能弄清楚如何使Apache发挥出色,我将使用它(内置的Web服务器运行得很好,但我更希望通过Apache进行工作)。一旦发生这种情况,我将在任何会使用Php的地方使用newLisp,因为我不喜欢Php,而我确实喜欢newLisp。
目前,Clojure并不是Android应用程序的不错选择,但我知道人们正在为此努力。因此,如果解决了这个问题,那将是我在实际应用程序中使用Lisp的方言的另一个地方……但这又是因为我只是不喜欢Java。
但老实说,我更喜欢Ruby,而不是Lisp ...,但这主要是社区和文档的问题。
我在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
中。