我有一個檔案:test.lisp內容如下:
( 3 3)
(let ((n 3)) ( n 1))
(let ((n 4))
( n 1))
(defun d (f)
(let ((n 3)
(f 4)
(g 3))
(if (= n 0)
( n f g)
(* n f g))))
我正在嘗試像這樣讀取檔案:
(let ((in (open dd)))
(when in
(loop for line = (read-line in nil)
while line do (format t "~a~%" line))
(close in)))
這給了我明顯的正確輸出:
( 3 3)
(let ((n 3)) ( n 1))
(let ((n 4))
( n 1))
(defun d (f)
(let ((n 3)
(f 4)
(g 3))
(if (= n 0)
( n f g)
(* n f g))))
我想parse-exp在與上面每個運算式對應的檔案的每一行上呼叫我的函式。
從 Stackoverflow 上的另一個答案,我嘗試這樣做:
* (defun get-file (filename)
(let ((in (open filename)))
(loop for line = (read-line in nil)
while line
collect line)))
GET-FILE
* (get-file dd)
("( 3 3)" "" "(let ((n 3)) ( n 1))" "" "(let ((n 4))" " ( n 1))" ""
"(defun d (f)" " (let ((n 3)" " (f 4)" " (g 3))" " (if (= n 0)"
" ( n f g)" " (* n f g))))")
它將每一行轉換為一個字串,而不是我想要的格式。
我也試過這樣做:
(uiop:read-file-lines "file.txt")
但我得到與前一個示例相同的輸出。
我希望能夠使用每一行/運算式作為輸入parse-exp- 像這樣:
(parse-exp '( 3 3))或
(parse-exp '(let ((n 3)) ( n 1)))
等等。
我該怎么做呢?
謝謝。
uj5u.com熱心網友回復:
您搜索的內容read不是按read-line運算式讀取的內容(并且由 lisp 解釋器使用)。
(with-open-file (stream "test1.lisp")
(loop for expr = (read stream nil 'eof)
until (eq expr 'eof)
collect expr))
;; (( 3 3) (LET ((N 3)) ( N 1)) (LET ((N 4)) ( N 1))
;; (DEFUN D (F) (LET ((N 3) (F 4) (G 3)) (IF (= N 0) ( N F G) (* N F G)))))
;; every element is an expression.
如果您希望運算式是字串而不是符號串列,請使用(format nil "~a" ...):
(with-open-file (stream "test1.lisp")
(loop for expr = (read stream nil 'eof)
until (eq expr 'eof)
collect (format nil "~a" expr)))
;; ("( 3 3)" "(LET ((N 3)) ( N 1))" "(LET ((N 4)) ( N 1))"
;; "(DEFUN D (F) (LET ((N 3) (F 4) (G 3)) (IF (= N 0) ( N F G) (* N F G))))")
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/474144.html
上一篇:C 如何創建指向函式的常量指標?
