从终端命令提示符运行Common Lisp函数

 捕鱼达人qq怎么刷金币 发布于 2023-02-13 17:25

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

我也在使用Mac OSX和终端.

1 个回答
  • SBCL手册描述了三个有用的选项

    3.3.1运行时选项

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

    3.3.2 Toplevel选项

    --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到to 的等价--eval (load "filename"),你可以只使用文件名的基础,如果有编译版本,那么SBCL应该加载,如果没有,那么SBCL将加载源文件,你会得到这样编译代码.例如,在下面,我们只使用--load test:

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

    2023-02-13 17:26 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有