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

时间:2015-02-05 10:20:14

标签: shell batch-file common-lisp gnu-common-lisp

我从shell脚本调用Lisp函数(以及其他一些东西)。为简洁起见,以下是脚本的相关部分:

  

./ gcl -load /tmp/calendrica-3.0.cl-batch -eval'(格式T" ~a"   (CC3 :: sunset(CC3 :: fixed-from-gregorian)(CC3 :: gregorian-date 1996   CC3 :: 2月25日))CC3 ::耶路撒冷))'   728714.7349874675

上面的代码工作正常,但我必须为每个使用的符号附加包名CC3;这使得代码难以操作且难以输入。

我尝试使用use-package

来简化它
  

./ gcl -load /tmp/calendrica-3.0.cl-batch -eval'(格式T" ~a"   (use-package" CC3")(日落(固定从格里高利(gregorian-date 1996年2月25日))耶路撒冷))'

更容易阅读和输入,但不幸的是它不起作用。我已经尝试了各种方法来包含use-package指令,但到目前为止还没有成功。

是否可以在通过GNU Common Lisp(gcl)加载指令启动Lisp程序时包含use-package指令?

更新 解决方案是按照接受的答案建议使用多次逃避。

  

./ gcl -load /tmp/calendrica-3.0.cl-batch -eval   '(use-package" CC3")' -eval'(格式T" ~a"(日落   (固定来自格里高利(gregorian-date 1996年2月25日))耶路撒冷))'

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

这可能是可能的,但它会很难看。

如果您对表单进行评估,它将首先阅读表单。因此,在评估期间改变读者(告诉新的包,......)为时已晚。因此,它需要在此之前完成。

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,你可以编写哪个首先创建包,然后从字符串读取/ evals,该字符串在表单中编码。棘手。

备选方案:

  • 也许Lisp允许启动多个-eval表单?做任何你需要的东西来初始化Lisp以了解第一个-eval形式的包。然后让代码以第二种形式执行。

  • 写一个文件并在那里放置必要的表格。加载它。由于文件可以包含多个表单,因此您可以在顶部使用DEFPACKAGEIN-PACKAGE或类似表单,然后根据它将文件中的其余代码包含在内。