【问题标题】:Store list from file input stream, in a variable in LISP将文件输入流中的列表存储在 LISP 中的变量中
【发布时间】:2017-04-17 11:32:20
【问题描述】:

我可以在 .txt 文件中说以下列表

(5 3 1)

我正在尝试使用以下源代码将上述列表存储在 LISP 中的变量中。在第一种格式之前,一切似乎都是正确的。但后来我意识到*originalStateVar* 没有被视为具有 3 个原子的列表,而是被视为具有 1 个原子的列表。源码如下:

(defvar *originalStateVar*)
(defun fileInput ()
  (let ((i 1)(in (open *originalStateLocation* :if-does-not-exist nil)))
        (when in
            (loop
                for line = (read-line in nil)
                while line do 
                    (format t "~a~%" line)                ;debug line
                    (format t "i is <~a>~%" i)            ;debug line
                    (setf *originalStateVar* (list line)) ;storing list in variable
                    (setf i (+ i 1)))                     ;debug line
            (close in))
        (format t "originalStateVar is <~a>" (car *originalStateVar*))
        (format t "second element originalStateVar is <~a>~%" (cadr *originalStateVar*))
        (format t "third element originalStateVar is <~a>~%" (caddr *originalStateVar*))))

上述代码的输出是:

(5 3 1)
i is <1>
first element originalStateVar is <(5 3 1)>
second element originalStateVar is <NIL>
third element originalStateVar is <NIL>

我能说的只是它将 (5 3 1) 作为单个原子存储在一个列表中,所以它变成了类似于((5 3 1)) 的东西,这就是为什么cadr 返回NIL

任何有关如何使*originalStateVar* 得到这种对待的帮助,将不胜感激!

【问题讨论】:

    标签: lisp common-lisp


    【解决方案1】:
    • 使用WITH-OPEN-FILE 而不是OPEN
    • 使用READ 而不是READ-LINE

    例子:

    CL-USER 11 > (let ((*read-eval* nil))
                   (with-open-file (in "/tmp/test.data")
                     (read in)))
    (1 2 3)
    
    CL-USER 12 > (let ((*read-eval* nil))
                   (with-open-file (in "/tmp/test.data")
                     (describe (read in))))
    
    (1 2 3) is a LIST
    0      1
    1      2
    2      3
    

    【讨论】:

    • ("((5 3 1))") is a list of length 1. 它的处理方式完全是我不希望的。如何制作 5 3 1 个单独的列表原子?
    • 所以我的错误是我初始化originalStateVar 的方式?我有点难以理解出了什么问题。
    • @MrDiaman 您似乎使用的是READ-LINE(将一行文本作为字符串返回)而不是READ(读取Lisp 对象)。
    猜你喜欢
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多