【问题标题】:Running a Common Lisp function from a Terminal command prompt从终端命令提示符运行 Common Lisp 函数
【发布时间】:2013-12-16 14:08:35
【问题描述】:

我很难找到答案,所以也许不可能。我希望能够从命令行加载/编译 lisp 文件的灵活性,即不在 emacs 内,然后也从命令行运行该文件中的 lisp 函数之一。这无疑是特定于实现的功能,因此任何提供此功能的实现指针(或者它可能是相当标准的,我不知道)。我正在使用 SBCL 并且喜欢它,所以如果它可以做到这一点,那就太好了。

我也在使用 Mac OSX 和终端。

【问题讨论】:

    标签: lisp common-lisp sbcl


    【解决方案1】:

    我正在尝试通过 knitr 将 sbcl Common-Lisp 集成到 R 中。 这里有一些关于如何向sbcl 发送评估请求然后将其返回给 R 的测试。这适用于发送表单,而不是文件。从终端:

    sbcl --noinform --eval '(progn (print (* 2 3 4 5)) (sb-ext:quit))'
    ;; 120

    sbcl --noinform --eval '(progn (print (* 2 3 4 5)) (sb-ext:quit))'
    ;;你好世界

    sbcl --noinform --eval "(progn (dotimes (i 5) (print i)) (sb-ext:quit))"
    ;; 0
    ;; 1
    ;; 2
    ;; 3
    ;; 4

    【讨论】:

      【解决方案2】:

      正如其他人所展示的,几乎所有的实现都有一些通过终端运行 Lisp 代码。还有一些包装器为许多实现提供通用接口:CIMcl-launch

      【讨论】:

        【解决方案3】:

        SBCL 手册描述了三个有用的选项

        3.3.1 Runtime Options

        --noinform
        禁止打印任何横幅或其他 启动时的信息性消息。这使得编写 Lisp 变得更容易 在 Unix 管道中干净地工作的程序。另请参阅--noprint--disable-debugger 选项。

        3.3.2 Toplevel Options

        --eval command
        在执行任何初始化文件之后,但在标准输入上开始 read-eval-print 循环之前,读取和评估 给出的命令。可以使用多个--eval 选项,并且所有 将按照它们在命令中出现的顺序被读取和执行 行。

        --load filename
        这相当于--eval '(load "filename")'。特殊语法旨在减少调用时的引用问题 来自 shell 脚本的 SBCL。

        给定一个包含内容的文件test.lisp

        (defun hello-world ()
          (print 'hello-world)
          (terpri))
        

        我们可以用 SBCL 做到这一点:

        $ sbcl --noinform --load test.lisp --eval '(progn (hello-world) (sb-ext:quit))'
        
        HELLO-WORLD 
        

        (progn ... (sb-ext:quit)) 确保程序在执行(hello-world) 后结束。否则,您将进入 SBCL 提示符。由于代码在 SBCL 中自动编译,因此您正在运行的函数在运行 (hello-world) 时已经编译。如果你已经提前编译好了文件,你可以把编译好的文件传给--load。例如,

        $ sbcl --noinform --load test.fasl --eval '(hello-world)'
        
        HELLO-WORLD 
        

        事实上,鉴于--load--eval (load "filename") 等价,你可以只使用文件名的基数,如果有编译版本,那么SBCL 应该加载它,如果没有,那么SBCL 将加载源文件,您将以这种方式获得编译代码。例如,在下面,我们只使用--load test

        $ sbcl --noinform --load test --eval '(hello-world)'
        
        HELLO-WORLD 
        

        【讨论】:

          【解决方案4】:

          以下是first google result的贴:

          CLISP

          如果您使用的是 CLISP Common Lisp 环境,则以下内容适用。

          要将名为 test.lisp 的程序编译成名为 test.fas 的字节码文件,请执行以下操作。

          clisp -c test.lisp

          如果您希望显示较少的输出,请改为执行以下操作。

          clisp -q -c test.lisp

          要运行已编译(甚至未编译,如果您跳过上述步骤)的 Lisp 文件,请执行以下操作,假设您的入口函数名为 main。通常主函数的结果在它完成时会显示出来,但是 (quit) 命令会阻止它。 -on-error abort 选项可防止 clisp 进入调试提示,并在出现错误时退出。

          clisp -q -q -on-error abort -x '(progn (load "test") (main) (quit))'

          我刚刚在我的 Arch linux 终端上测试了它,你可以执行以下操作:

          $ clisp myprogram.lisp

          这将在终端中运行程序。如果你想编译它以供以后运行,请参见上面的位。

          【讨论】:

          • 很有趣,谢谢。对于 SBCL,我没有发现任何清晰的东西,出于性能原因,我更愿意使用它而不是 Clisp。
          • @OpenLearner,也许是sbcl --eval '(compile-file "filename")'。至少,它的manual 表示--load filename 相当于--eval '(load "filename")'
          • 好吧,我试着寻找答案,我得到的最接近的答案是:` $ sbcl --script filename.lisp` 虽然这仍然会打印一个很大的调试器消息,但我无法得到摆脱它。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-14
          • 2021-12-26
          • 2023-03-13
          相关资源
          最近更新 更多