Clisp从文件中读取列表并将其展平,但不起作用,无法将lst识别为列表

Clisp从文件中读取列表并将其展平,但不起作用,无法将lst识别为列表,lisp,common-lisp,clisp,Lisp,Common Lisp,Clisp,从文件中读取字符。当您计算文件长度并调用读取序列时,您所做的就是读取平面列表中的所有字符。即,在您的示例中,lst是以下列表: (defun read-file-list (infile) (with-open-file (instream infile :direction :input :if-does-not-exist nil) (when instream (let ((list (make-list (file-length instream))))

从文件中读取字符。当您计算
文件长度
并调用
读取序列
时,您所做的就是读取平面列表中的所有字符。即,在您的示例中,
lst
是以下列表:

(defun read-file-list (infile)
  (with-open-file (instream infile :direction :input :if-does-not-exist nil)
   (when instream 
     (let ((list (make-list (file-length instream))))
       (read-sequence list instream)
       list))))


(setq lst (read-file-list "/home/Desktop/nested_list.txt"))

(flatten-list lst )

(print lst)

;(1 2 3 (4 5 (12 11 9 6) 4 8 (77 53(47)) (12 15 18)) 
; file has got this line
您可以看到,此列表中的所有元素都是字符,它们用
\\…
语法表示。例如,第一项描述如下(使用SBCL测试,实际输出可能因您的实现而异):

(打开文件(流“/tmp/file list.txt”) (读取(生成串联流)(生成字符串输入流)(“”) 流动 (使字符串输入流“)”)) 您要做的是调用该文件

* (describe (first lst))
#\(
[standard-char]

Char-code: 40
Char-name: LEFT_PARENTHESIS
; No value
这里的读取值是数字和嵌套列表的列表

* (with-open-file (in "/tmp/file-list.txt")
    (read in))
(1 2 3 (4 5 (12 11 9 6) 4 8 (77 53 (47)) (12 15 18)))
----编辑

您的
展平列表
功能似乎正常工作,我想说的是,您的输入列表位于另一个文件中,您需要通过调用
read
,使用标准Lisp读取器提取数据:

* (describe (first *))
1
[fixnum]
; No value
---编辑2

如果文件包含列表元素,如下所示:

* (with-open-file (in "/tmp/file-list.txt")
    (flatten-list (read in)))

(1 2 3 4 5 12 11 9 6 4 8 77 53 47 12 15 18)
然后您可以编写一个循环,如下所示:

1 2 3 (4 5 (12 11 9 6) 4 8 (77 53(47)) (12 15 18))
或者,您可以使用连接流:

(loop 
  for form = (read in nil in)
  until (eq form in)
  collect form)
或相当于:

USER> (with-input-from-string (open "(")
        (with-input-from-string (close ")")
          (with-open-file (file "/tmp/file-list.txt")
            (read (make-concatenated-stream open file close)))))
(1 2 3 (4 5 (12 11 9 6) 4 8 (77 53 (47)) (12 15 18)))
从文件中读取字符。当您计算
文件长度
并调用
读取序列
时,您所做的就是读取平面列表中的所有字符。即,在您的示例中,
lst
是以下列表:

(defun read-file-list (infile)
  (with-open-file (instream infile :direction :input :if-does-not-exist nil)
   (when instream 
     (let ((list (make-list (file-length instream))))
       (read-sequence list instream)
       list))))


(setq lst (read-file-list "/home/Desktop/nested_list.txt"))

(flatten-list lst )

(print lst)

;(1 2 3 (4 5 (12 11 9 6) 4 8 (77 53(47)) (12 15 18)) 
; file has got this line
您可以看到,此列表中的所有元素都是字符,它们用
\\…
语法表示。例如,第一项描述如下(使用SBCL测试,实际输出可能因您的实现而异):

(打开文件(流“/tmp/file list.txt”) (读取(生成串联流)(生成字符串输入流)(“”) 流动 (使字符串输入流“)”)) 您要做的是调用该文件

* (describe (first lst))
#\(
[standard-char]

Char-code: 40
Char-name: LEFT_PARENTHESIS
; No value
这里的读取值是数字和嵌套列表的列表

* (with-open-file (in "/tmp/file-list.txt")
    (read in))
(1 2 3 (4 5 (12 11 9 6) 4 8 (77 53 (47)) (12 15 18)))
----编辑

您的
展平列表
功能似乎正常工作,我想说的是,您的输入列表位于另一个文件中,您需要通过调用
read
,使用标准Lisp读取器提取数据:

* (describe (first *))
1
[fixnum]
; No value
---编辑2

如果文件包含列表元素,如下所示:

* (with-open-file (in "/tmp/file-list.txt")
    (flatten-list (read in)))

(1 2 3 4 5 12 11 9 6 4 8 77 53 47 12 15 18)
然后您可以编写一个循环,如下所示:

1 2 3 (4 5 (12 11 9 6) 4 8 (77 53(47)) (12 15 18))
或者,您可以使用连接流:

(loop 
  for form = (read in nil in)
  until (eq form in)
  collect form)
或相当于:

USER> (with-input-from-string (open "(")
        (with-input-from-string (close ")")
          (with-open-file (file "/tmp/file-list.txt")
            (read (make-concatenated-stream open file close)))))
(1 2 3 (4 5 (12 11 9 6) 4 8 (77 53 (47)) (12 15 18)))

您的建议是什么,我并不理解,Flatte func适用于manuel输入,但对于lst不适用。是的,您的
lst
是一个字符列表,“#\0”是一个字符,类似于
“0123”
等字符串中的值,这与数字0不同。您正在从输入文件中读取字符,因此有一个很大的字符列表,包括“#”(“开括号;您需要做的是将文件解析为lisp数据,这样字符串
”(01(2))“
实际上被读取为列表
(01(2))
,而不是字符序列
(#\0\35;\ 1\2\)#\)
(请注意,这是一个简单的列表)。好的,成功了,谢谢,但是如果我的文件不是以'('括号,它给出错误,1不是list@Srknsmsk如果您的文件不包含Lisp列表的语法,而是包含单个项,那么您必须在循环中读取它们并将它们累积到列表中。我使用字符串进行读取,但字符串包含其他字符,我为此使用getfromstring funct。您的建议是什么,我没有理解,佛罗里达州tten func适用于manuel输入,但lst不适用于是,您的
lst
是一个字符列表,“#\0”是一个字符,类似于
“0123”这样的字符串中的值
,这与数字0不同。您正在从输入文件中读取字符,因此有一个很大的字符列表,包括“#”(“开括号;您需要做的是将文件解析为lisp数据,这样字符串
”(0 1(2))“
实际上被读取为列表
(0 1(2))
而不是字符序列
(#\0#\1#\(#\2#\)#\)
(注意,这是一个平面列表)。好的,行了,谢谢,但如果我的文件不是以('括号,它给出错误,1不是list@Srknsmsk如果您的文件不包含Lisp列表的语法,而是包含单个项,那么您必须在循环中读取它们并将它们累积到列表中。我使用字符串进行读取,但字符串包含其他字符,我为此使用getfromstring funct注意
文件长度
可能不包含如果你是以字符的形式读取文件,不要告诉你你想知道什么,因为至少在Unixoid系统上,以字符而不是字节的形式知道这样一个文件的长度的唯一方法是读取整个文件。你需要清楚地描述实际问题的原因。例如,扁平化列表似乎是不平坦的RainerJoswig的主要思想是展平,我在展平时有错误,但我的文件不是列表类型,我需要将其转换为列表类型请注意,
文件长度
可能不会告诉您读取文件时想要知道什么,如果您是以字符形式读取文件,因为至少在Unixoid系统上,了解le的唯一方法是这样一个文件的长度(以字符为单位,而不是以字节为单位)是读取整个文件。您需要清楚地描述实际问题的原因。例如,扁平化列表似乎与您的问题无关。@RainerJoswig的主要思想是扁平化,我在扁平化方面有错误,但我的文件不是列表类型,我需要将其转换为列表类型