如何在命令行启动Lisp程序时指定包名称?

3
我正在从shell脚本中调用一个Lisp函数(以及其他一些东西)。为简洁起见,下面是脚本的相关部分:
./gcl -load /tmp/calendrica-3.0.cl -batch -eval '(format T "~a" (CC3::sunset (CC3::fixed-from-gregorian (CC3::gregorian-date 1996 CC3::february 25)) CC3::jerusalem))' 728714.7349874675
以上代码可以正常工作,但我不得不在使用的每个符号后附加包名称CC3;这使得代码笨重且难以输入。
我试图这样简化它,使用use-package:
./gcl -load /tmp/calendrica-3.0.cl -batch -eval '(format T "~a" (use-package "CC3") (sunset (fixed-from-gregorian (gregorian-date 1996 february 25)) jerusalem))'
更容易阅读和输入,但不幸的是它不起作用。我尝试了各种方法来包含use-package指令,但迄今为止没有成功。
在通过GNU Common Lisp的(gcl) load指令启动Lisp程序时是否可能包含use-package指令?
更新: 解决方案是使用多个eval,如接受的答案所建议的那样。
./gcl -load /tmp/calendrica-3.0.cl -batch -eval '(use-package "CC3")' -eval '(format T "~a" (sunset (fixed-from-gregorian (gregorian-date 1996 february 25)) jerusalem))'
2个回答

6
也许你可以使用多个eval,在这里是我在sbcl中所做的。
#!/bin/sh
sbcl --noinform \
   --eval '(load "boot.lisp")' \
   --eval '(in-package #:my-pkg)' \
   --eval "(do-something-useful)" # do-something-useful is in my-pkg

3

可能可以做到,但这会很丑陋。

如果您给它一个形式表单评估,它将首先读取表单。因此,在评估过程中更改阅读器(告诉新包等)已经太晚了。因此,需要在此之前完成。

CL-USER 1 > (eval (read-from-string "(foo::bar)"))
Error: Reader cannot find package FOO.

Better:

CL-USER 5 > (eval '(progn (defpackage foo (:use "CL"))
                          (read-from-string "(foo::bar)")))
(FOO::BAR)

因此,如果您想将单个表单传递给eval,则需要编写以下内容:首先创建包,然后从编码在表单中的字符串中读取/评估。有些棘手。

替代方案:

  • 也许Lisp允许在启动时使用多个-eval形式?只需执行所需操作以使Lisp知道第一个-eval形式中的包即可。然后在第二个表单中执行代码。

  • 编写文件并放置必要的表单。加载它。由于文件可以包含多个表单,因此您可以在顶部使用DEFPACKAGEIN-PACKAGE或类似的语句,然后在其基础上编写其余代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接