使用Lisp编写脚本是否可行,而不是Ruby / Python / Perl /(插入可接受的脚本语言)?我的意思是做文件处理(打开文本文件,计算单词数,返回第n行),字符串处理(反向,分割,切片,删除标点符号),原型设计/快速计算等内容。通常使用Python等。与使用Ruby / Python / Perl /脚本语言相比,在Lisp中执行此类任务的效率如何?
我问,因为我想学习一个Lisp,但也用它来做一些事情,而不仅仅是为了它而学习它。我环顾四周,但在Lisp中找不到有关脚本编写的大量信息。如果可行,那么什么是好的实施?
谢谢!
答案 0 :(得分:10)
今天,使用LISP
,好像确定任何人都能理解一个人所说的语言是荒谬的,因为自70年代以来或者也许早些时候它还不是一种语言。 LISP只表示它是完全带括号的波兰语前缀表示法,就像Pascal,Ruby,Python和Perl一样只是variations of ALGOL。
Scheme
是标准,Common LISP
是标准。这两者都是通用的,但Common LISP
是电池,而Scheme
是简约语言。它们的风格大不相同,因此比较它们就像将Java
与Python
进行比较。
嵌入式LISPS
Scheme
和专门的LISP方言有很多用作嵌入式语言的用法。 Emacs是unix网段中使用最广泛的编辑器,其lisp elisp
是最常用的lisp语言。图像处理应用GIMP具有Scheme
基础,可扩展图像处理。
独立脚本
在许多使用标准Common LISP
的{{1}}实现中,可以使脚本作为可执行文件运行并将其作为应用程序运行。例如。我使用#!
并使用CLISP
作为第一行的脚本。我也以同样的方式使用#!/usr/bin/clisp -C
,并且在使用Scheme
的非常快速的增量编译器ikarus中。 #!/usr/bin/ikarus --r6rs-script
具有Java库的所有功能,您可以使用自己的类,也可以使用Clojure
更长久的申请
在#!/usr/bin/env java -cp /path/to/clojure-1.2.0.jar clojure.main
中,您可以转储图片。它将是一个Common Lisp二进制文件,您的代码已经编译进来。许多Scheme实现都编译为native,Common LISP
可以编译为java字节码(尽管这不是最常用的方法)。我仍然有过Ikarus的经验,有时比从球拍,鸡和开局的编译可执行文件解释得更快,所以我经常在Clojure
中进行编程并在Scheme中的DrRacket
中运行。
同时尝试ikarus
和Common LISP
,因为它们都足以满足您在问题中指定的任务。有很多关于这个主题的免费书籍,有些也值得他们的价格。您也可以尝试Scheme
,这是Racket
偏离日常任务的大量库,但它不符合任何标准。
关于生产力
我想你指的是用Lisp方言写一个特定任务的速度有多快。我想这取决于你对语法的使用方式。只知道Algol方言后需要一段时间才能习惯它。它需要采用不同的方法,您需要以更具功能性的方式进行思考,尤其是Scheme
。我想,当你在Scheme中和你最喜欢的Algol方言一样好时,它会是相似的。例如。一些algol方言比其他方言的原型更快,对于Lisp方言也是如此。
答案 1 :(得分:5)
当我第一次开始使用Lisp时,我用它来编写shell脚本...我对OCD有点关于顺序和统一性而且我真的很喜欢Lisp语言,因为它们有更健全的语法(更少的语法规则,没有相关的随机决策)特定的语法元素。)
如果您正在研究Common Lisp,那么在任何Linux发行版上默认安装的SBCL都可以立即用于CGI脚本。 SBCL还可以处理命令行参数,访问管道,进程等。如果你不是在不同Lisps之间的可移植性,那么我会说你很好。只是为了举例说明我在哪里使用这个脚本:我们办公室里的一个女孩编译并维护了一个单词列表,我必须在我们的应用程序中进一步处理。此列表以Googledoc电子表格形式提供。我的脚本会下载单词表并将其解析为我需要的格式。在编译项目之前,我有脚本帮助我进行文件操作和预处理(项目不在Lisp中)。
最后,SBCL有自己的方法与FastCGI http://kdr2.com/project/sb-fastcgi.html一起使用,但当然有几个完整的HTTP服务器,你可以按原样使用,也可以放在代理之后。 Hunchentoot在历史上最受欢迎,但也有其他人,如cl-http
,这里有更多链接:http://www.cliki.net/web。
#!/usr/bin/env sbcl --script
将是使用的shebang评论。
此外,我在课堂上使用Common Lisp,只是为了完成我的作业,我想,当你说“打开文本文件,计算单词数量,返回第n行”时,你所做的是什么。这是我在课堂上使用的一个例子:https://github.com/wvxvw/coursera-logic/blob/master/formula.lisp。
由于有关于此事的讨论,这里还有其他事情需要考虑。
通常,脚本语言具有双重性质:它们是用低级语言编写的,同时向程序员公开高级API。这可能是一种祝福或诅咒。一方面,Python,Ruby,JavaScript等语言具有高度优化的库来处理常见任务,而Common Lisp通常与C ++或Java类似,在Lisp中实现所有内容。因此,例如,字符串在CL中不那么复杂,然后它们在JavaScript中:在CL中它们是简单的字符数组,而在JS中它们是一种特殊的树,称为绳索。
通常,编写脚本语言的程序员既不需要也不期望提取高性能代码。该语言通过基本级别高度优化的库代码对其进行补偿。不幸的是,一旦程序员真的想从脚本语言中尽可能地挤出尽可能多的性能,看起来他们只是没有工具来执行它,因为他们无法深入到实现的底层。
另一方面,处理较低级别的细节意味着程序员整体效率较低,这需要更多技能,因为优化代码以与行业标准实现相提并论需要技巧。
Common Lisp通常属于第二类,但我认为它仍然适用于单行和休闲编程,因为广泛的库和高度发达的宏系统,可以减少通常与低级相关的冗长等级语言。
答案 2 :(得分:1)
我知道您提出了两个问题:
我可以回答你的第一个问题,但不是你的第二个问题。它在很大程度上取决于您的计划技能以及您希望(重新)在计划中编写多少代码的可行性。
所以我只回答你的第一个问题:)
看看这个问题:Running Scheme from the command line。
如果您已经安装了DrRacket(这是许多方案方言的好IDE)作为您的方案解释器,您可以在方案脚本中使用shebang行#! /usr/bin/env mzscheme
。
此测试脚本(test.scm
)
#!/usr/bin/env mzscheme
#lang scheme
(print (+ 40 2))
可以变为可执行(使用chmod +x test.scm
)并执行(使用./test.scm
)。
答案 3 :(得分:1)
我会说Lisp / Scheme可以用来编写小脚本或大应用程序。但它们尚未准备好广泛使用。
python / ruby和scheme之间的最大区别在于python有一个庞大的模块库集中在一个地方。 Ruby非常类似于带有ruby gems的python。
另一方面,方案可能会在互联网上散布一个小型模块库。模块的质量并不总是与python和ruby中的流行模块相比。
可以说他们的目标是不同的目标,但我会说计划刚刚变老,人们开始忘记它以及它如何被用作工具而不仅仅是学校的主题。
关于Lisp,我不能说。但是根据你的描述,你可以编写你想写的脚本,但是如果你需要某些特定的东西,它可能不存在,你必须自己重写它。
我所能说的只是跳进去。成为为这种语言提供未来的人。不要害怕。这种语言有一个光明的未来,你会从中学到很多东西。
答案 4 :(得分:0)
WRT你的任务,如何使用Emacs,它与交互式Python-shell一起提供。因此,您可以方便地编辑和运行脚本。