在Common Lisp中加载文件时读取下一行

时间:2015-06-11 22:46:12

标签: load lisp common-lisp stdin

我有一个文件test.lisp,基本上是这样的:

(load (compile-file "init.lisp"))
(my-funcA 2 3)
(my-funcB 4 5)
; bunch more lines like the last ones

在init.lisp文件中,我希望能够读取行(my-funcA 2 3),(my-funcB 4 5)等,并用它做一些事情。这可能吗?

我试图使用:

(let ((input (read)))
; do stuff here
)

在init.lisp文件中,但这只是等待来自keybord的输入,并且不会从正在加载的文件中读取。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

LOAD不会将*STANDARD-INPUT*(或任何其他标准流变量)绑定到它正在加载的文件,因此您需要自己执行此操作。

(defun load-with-stdin (filename) {
  (let ((eof '(:eof)))
    (with-open-file (*standard-input* filename)
      (loop for expr = (read *standard-input* nil eof)
            while (not (eq expr eof))
        do (eval expr)))))

(load-with-stdin "test.lisp")

然而,这似乎是一种奇怪的做事方式。为什么不在init.lisp中定义一个函数,并将其命名为:

(load (compile-file "init.lisp")) ;; defines some-func
(some-func '(my-funcA 2 3))
(some-func '(my-funcB 4 5))

答案 1 :(得分:0)

如果init.lisp知道加载它的文件的名称(也许是因为只有一个文件加载它并且你可以对名称进行硬编码),你可以通过将它放在init中来读取这些行。 .lisp:

(with-input-from-file (in "loader.lisp")
    (setf *load-form* (read in))  ;; *load-form* contains (load (compile-file "init.lisp"))
    (setf *my-func-a-form* (read in)) ;; (my-funcA 2 3)
    (setf *my-func-b-form* (read in))) ;; (my-funcB 4 5)

由于这些表格也是" loader.lisp"的源代码的一部分。 (或者你正在调用那个文件),一旦init.lisp完成加载,它们将被评估,无论你在init.lisp中用它们做什么。

然而,init.lisp可能会引发一些非常奇怪的恶作剧,例如根据调用它的参数来定义my-funca

(if (member 4 (cdr *my-func-a-form*))
    (defun my-funca (a)
        (format t "If you pass a literal 4 to me, then I only take one argument."))
    (defun my-funca (a b)
        (+ a (expt b a))))