【问题标题】:Is it feasible to use Lisp/Scheme as a scripting language? [closed]使用 Lisp/Scheme 作为脚本语言是否可行? [关闭]
【发布时间】:2013-12-01 07:08:24
【问题描述】:

相对于 Ruby/Python/Perl/(插入可接受的脚本语言),在 Lisp 中编写脚本是否可行?我的意思是做文件处理(打开一个文本文件,计算字数,返回第 n 行),字符串处理(反向,拆分,切片,删除标点符号),原型设计/快速计算以及其他你会做的事情通常使用 Python 等进行。与选择的 Ruby/Python/Perl/脚本语言相比,在 Lisp 中执行此类任务的效率如何?

我问是因为我想学习 Lisp,但也想用它来做某事,而不是仅仅为了它而学习它。我环顾四周,但找不到太多关于在 Lisp 中编写脚本的信息。如果可行,什么是好的实施方案?

谢谢!

【问题讨论】:

  • 为什么投反对票?如果您能解释为什么投反对票,将会很有帮助。
  • 我的猜测是这个答案可以用 Bias 来回答。
  • 明白了,有没有办法改写这个?我只想知道相对生产力,这对我来说似乎很客观。谢谢!
  • 有 scsh (scsh.net) 用于类似 shell 的脚本。
  • 鉴于足够快的执行时间(如果需要,包括任何 JIT 编译,您可以使用任何您喜欢的语言。如果它是解决手头问题的好语言,那将更容易编写(也许执行速度更快),但这不是要求。如果您了解它和问题领域,您将很有效率——同样,不是要求。

标签: python ruby scripting scheme lisp


【解决方案1】:

我了解到您提出了两个问题:

  1. 是否可以从命令行运行方案脚本
  2. 效果如何?

我可以回答您的第一个问题,但不能回答您的第二个问题。这在很大程度上取决于您的方案技能以及您想要(重新)在方案中编写多少代码它的可行性。

所以我只回答你的第一个问题:)

看看这个 SO 问题: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)。

【讨论】:

    【解决方案2】:

    我想说 Lisp/Scheme 可用于编写小型脚本或大型应用程序。但它们还没有准备好广泛使用。

    python/ruby 和 scheme 的最大区别在于 python 有一个巨大的模块库,集中在一个地方。 Ruby 与带有 ruby​​ gem 的 python 非常相似。

    另一方面,Scheme 可能有一个分散在互联网上的小型模块库。模块的质量并不总是与 python 和 ruby​​ 中的流行模块相比。

    可以说他们的目标不同,但我会说计划已经过时了,人们开始忘记它,以及如何将其用作工具而不仅仅是学校科目。

    关于 Lisp,我真的不能说。但是根据您的描述,可以编写您想编写的脚本,但如果您需要特定的东西,它可能不存在,您必须自己重写。

    我只能说,跳进去。成为给这种语言未来的人。不要害怕。这种语言有着光明的未来,你会从中学到很多东西。

    【讨论】:

    • Erm... 我认为 OP 的意思是 Lisp/Scheme,就像 Common Lisp/Scheme 中的两种最流行的方言一样,而不是指定 Scheme 是一种 Lisp。很多新人都有这样的困惑。当你说 Lisp 缺乏库代码的集中存储库时,我非常不同意你的看法。 Quicklisp 的行为方式与 pip 用于 Python 或 gem 用于 Ruby 的方式大致相同。请不要让我开始了解 Python 和 Ruby 库的质量。虽然确实有很多,但质量往往低于最卑微的期望。
    • 我主要是在评论 Scheme,因为我对 Lisp 无话可说。正如你所读到的,我没有说任何关于 lisp 的内容。
    • 您应该编辑您的答案以指定您只是在为 Scheme 回答,也许表明您的答案是基于 R6RS、R7RS-small 还是 R5RS ......(就像我可以谈论 java,但需要表明自 1.1 以来我没有碰过它)
    【解决方案3】:

    当我第一次开始研究 Lisp 时,我用它来编写 shell 脚本......我对秩序和统一性有点强迫症,我真的很喜欢 Lisp 语言,因为它们的语法更清晰(语法规则更少,没有随机决策相关到特定的语法元素)。

    如果您正在研究 Common Lisp,那么任何 Linux 发行版上默认安装的 SBCL 都可以立即用于 CGI 脚本。 SBCL 也有处理命令行参数、访问管道、进程等的方法。如果你不追求不同 Lisp 之间的可移植性,那么我会说你很高兴。举个例子,说明我在哪里使用了这个脚本:我们办公室的一个女孩编译并维护了一个单词列表,我必须在我们的应用程序中进一步处理这些单词。该列表以 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 通常属于第二类,但我认为它仍然适用于单行和随意编程,因为它具有广泛的库和高度开发的宏系统,可以减少通常与低级相关的冗长性级别的语言。

    【讨论】:

      【解决方案4】:

      今天,使用LISP 好像肯定有人会理解一个人在说什么语言是荒谬的,因为自 70 年代或可能更早的一段时间以来它就不是一种语言。 LISP 仅表示它是完全带括号的波兰语前缀表示法,就像 Pascal、Ruby、Python 和 Perl 只是 variations of ALGOL

      Scheme 是标准,Common LISP 是标准。尽管Common LISP 是包含电池,而Scheme 是一种简约语言,但这两者都是通用的。它们的风格完全不同,因此比较它们就像比较 JavaPython

      嵌入式 LIPS

      Scheme 和专门的 LISP 方言作为嵌入式语言有很多用途。 Emacs 是 unix 领域中使用最广泛的编辑器,因此它的 lisp elisp 是最常用的 lisp 语言。图像处理应用GIMP 有一个Scheme 基础,带有图像处理扩展。

      独立脚本

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

      更永久的应用程序

      Common LISP 中,您可以转储图像。它将是一个 Common Lisp 二进制文件,其中您的代码已经编译。许多 Scheme 实现都编译为原生,Clojure 可以编译为 java 字节码(尽管这不是最常见的方法)。尽管如此,我还是有过使用 Ikarus 的经验,有时它的解释速度比从球拍、鸡肉和 gambit 编译的可执行文件更快,所以我经常在 DrRacket 中进行编程,并在 Scheme 中在 ikarus 中运行它。

      尝试Common LISPScheme,因为它们都足以完成您在问题中指定的任务。有很多关于这个主题的免费书籍,有些也物有所值。你也可以试试Racket,这是一个Scheme,有很多日常任务的库,但它不符合任何标准。

      关于生产力

      我想您指的是用 Lisp 方言编写某个任务的速度有多快。我想这取决于您对语法的使用程度。只知道阿尔戈方言需要一段时间才能适应。它采用不同的方法,并且您需要以更实用的方式思考,尤其是对于Scheme。我想当你在 Scheme 中的表现和你最喜欢的 Algol 方言一样好时,它会是相似的。例如。一些 algol 方言比其他方言更快地制作 inn 原型,对于 Lisp 方言也是如此。

      【讨论】:

      • 谢谢,我现在正在研究 CL 和 Racket!
      【解决方案5】:

      WRT 到您的任务,使用 Emacs 怎么样,它带有一个交互式 Python-shell。因此,您可以方便地在运行脚本的同时进行编辑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-12
        • 2012-10-02
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 2013-06-19
        • 2011-06-10
        • 1970-01-01
        相关资源
        最近更新 更多