2015-06-11 53 views
0

時,我有一個文件,即test.lisp基本上是這樣的:閱讀下一行共同加載文件Lisp的

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

裏面的init.lisp文件我想能夠讀線(我-funcA 2 3),(my-funcB 4 5)等等,並且用它做東西。這可能嗎?

我試着使用:

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

的init.lisp文件中,但這只是不斷從keybord等待輸入,並且不會被加載文件讀取。任何幫助將非常感激!

回答

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)) 
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))))