使用Lisp/Scheme作为脚本语言是否可行?

Imp*_*ity 9 ruby lisp python scripting scheme

是否可以在Lisp中编写脚本,而不是Ruby/Python/Perl /(插入可接受的脚本语言)?我的意思是做文件处理(打开文本文件,计算单词数,返回第n行),字符串处理(反向,分割,切片,删除标点符号),原型设计/快速计算等内容.通常使用Python等.与使用Ruby/Python/Perl /脚本语言相比,在Lisp中执行此类任务的效率如何?

我问,因为我想学习一个Lisp,但也用它做一些事情,而不仅仅是为了它而学习它.我环顾四周,但在Lisp中找不到有关脚本编写的大量信息.如果可行,那么什么是好的实施?

谢谢!

Syl*_*ter 10

今天,使用LISP好像确定任何人都能理解一个人所说的语言是荒谬的,因为它自70年代以来或者也许早些时候也不是一种语言.LISP仅表示它是完全带括号的波兰语前缀表示法,就像Pascal,Ruby,Python和Perl一样只是ALGOL的变体.

Scheme是一个标准,Common LISP是一个标准.这两者都是通用的,虽然Common LISP是电池,但是Scheme是一种简约语言.他们是完全不同的风格,从而对它们进行比较会是比较喜欢JavaPython.

嵌入式LISPS

Scheme作为嵌入式语言,有许多使用和专门的LISP方言.Emacs是unix细分中使用最广泛的编辑器,因此它的lisp elisp是最常用的lisp语言.图像处理应用GIMPScheme基础是图像处理的扩展.

独立脚本

在许多Common LISP实现中,使用标准#!注释可以使脚本作为可执行文件运行并将其作为应用程序运行.例如.我使用CLISP并使用脚本#!/usr/bin/clisp -C作为第一行.我也使用Scheme相同的方式和你使用的非常快速的增量编译器ikarus #!/usr/bin/ikarus --r6rs-script.Clojure拥有Java库的所有功能,您可以使用自己的类,也可以使用它#!/usr/bin/env java -cp /path/to/clojure-1.2.0.jar clojure.main

更永久的应用

Common LISP你可以转储图像.它将是一个Common Lisp二进制文件,您的代码已经编译进来.许多Scheme实现都编译为native,Clojure可以编译为java字节码(尽管这不是最常用的方法).我仍然有过Ikarus的经验,有时比从球拍,鸡和开局的编译可执行文件解释得更快,所以我经常在Scheme中编程DrRacket并运行它ikarus.

尝试两者Common LISP,Scheme因为它们都足以满足您在问题中指定的任务.有很多关于这个主题的免费书籍,有些也值得他们的价格.您也可以尝试Racket,这是一个Scheme与日常任务有很多库的偏差,但它不符合任何标准.

关于生产力

我想你指的是用Lisp方言写一个特定任务的速度有多快.我想这取决于你对语法的使用方式.只知道Algol方言后需要一段时间才能习惯它.它需要不同的方法,你需要以更具功能性的方式思考,特别是对于Scheme.我想,当你在Scheme中和你最喜欢的Algol方言一样好时,它会是相似的.例如.一些algol方言比其他方言的原型更快,对于Lisp方言也是如此.


小智 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
Run Code Online (Sandbox Code Playgroud)

将是使用的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通常属于第二类,但我认为它仍然适用于单行和休闲编程,因为广泛的库和高度发达的宏系统,可以减少通常与低级语言相关的冗长.