我有一个文件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的输入,并且不会从正在加载的文件中读取。任何帮助将不胜感激!
答案 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))))