Types Lisp-读取文件时Do表单中的类型错误

Types Lisp-读取文件时Do表单中的类型错误,types,io,char,common-lisp,sbcl,Types,Io,Char,Common Lisp,Sbcl,[SBCL]我正在尝试从一个文本文件中逐字符读取,该文件如下所示: :table E E E E E E C C C E E E E E E 我的代码(为了清晰起见省略了一些代码): 在“值NIL不是CHARACTER类型”这一行中给出了一个错误。即使将debug设置为3,回溯也没有任何用处。它告诉我的是,我调用了readtxt,它的参数是一个文件路径 当我打印文件中的每个字符时,它们都不是零。如果在do的主体中使用char=我不会得到错误。代码编译时没有错误或警告 (defun read-t

[SBCL]我正在尝试从一个文本文件中逐字符读取,该文件如下所示:

:table
E E E E E
E C C C E
E E E E E
我的代码(为了清晰起见省略了一些代码):

在“值NIL不是CHARACTER类型”这一行中给出了一个错误。即使将debug设置为3,回溯也没有任何用处。它告诉我的是,我调用了readtxt,它的参数是一个文件路径

当我打印文件中的每个字符时,它们都不是零。如果在do的主体中使用char=我不会得到错误。代码编译时没有错误或警告

(defun read-txt (path)
  (with-open-file str path :direction :input
    :if-exists :supersede)
  (let ((a nil)
        (form read-line str))
    (case form
      (otherwise (do* ((char (read-char str nil) (read-char str nil))
                       (count 0 (if (char= char #\Newline) (1+ count) count)))
                      ((null char) a))))))
这就是代码正确缩进时的样子

在编译此代码时,SBCL表示:

; in: DEFUN READ-TXT
;     (WITH-OPEN-FILE STR PATH :DIRECTION :INPUT :IF-EXISTS :SUPERSEDE)
; 
; caught ERROR:
;   during macroexpansion of (WITH-OPEN-FILE STR PATH ...). Use *BREAK-ON-SIGNALS*
;   to intercept.
;   
;    error while parsing arguments to DEFMACRO WITH-OPEN-FILE:
;      invalid number of elements in
;        STR
;      to satisfy lambda list
;        (STREAM SB-IMPL::FILESPEC &REST SB-IMPL::OPTIONS):
;      at least 2 expected, but got a non-list

;     (LET ((A NIL) (FORM READ-LINE STR))
;       (CASE FORM
;         (OTHERWISE
;          (DO* (#
;                #)
;               (# A)))))
; 
; caught ERROR:
;   The LET binding spec (FORM READ-LINE STR) is malformed.

;     (SB-INT:NAMED-LAMBDA READ-TXT
;         (PATH)
;       (BLOCK READ-TXT
;         (WITH-OPEN-FILE STR PATH :DIRECTION :INPUT :IF-EXISTS :SUPERSEDE)
;         (LET ((A NIL) (FORM READ-LINE STR))
;           (CASE FORM (OTHERWISE #)))))
; 
; caught STYLE-WARNING:
;   The variable PATH is defined but never used.
; 
; compilation unit finished
;   caught 2 ERROR conditions
;   caught 1 STYLE-WARNING condition
由于代码甚至不编译,并且有几个语法错误,因此很难推测在运行不同的代码时会看到哪些错误

但是很清楚:
char=
需要一个字符。但是在循环中,它可以得到一个非字符的
NIL
参数。如果代码真的能正常工作

这就是代码正确缩进时的样子

在编译此代码时,SBCL表示:

; in: DEFUN READ-TXT
;     (WITH-OPEN-FILE STR PATH :DIRECTION :INPUT :IF-EXISTS :SUPERSEDE)
; 
; caught ERROR:
;   during macroexpansion of (WITH-OPEN-FILE STR PATH ...). Use *BREAK-ON-SIGNALS*
;   to intercept.
;   
;    error while parsing arguments to DEFMACRO WITH-OPEN-FILE:
;      invalid number of elements in
;        STR
;      to satisfy lambda list
;        (STREAM SB-IMPL::FILESPEC &REST SB-IMPL::OPTIONS):
;      at least 2 expected, but got a non-list

;     (LET ((A NIL) (FORM READ-LINE STR))
;       (CASE FORM
;         (OTHERWISE
;          (DO* (#
;                #)
;               (# A)))))
; 
; caught ERROR:
;   The LET binding spec (FORM READ-LINE STR) is malformed.

;     (SB-INT:NAMED-LAMBDA READ-TXT
;         (PATH)
;       (BLOCK READ-TXT
;         (WITH-OPEN-FILE STR PATH :DIRECTION :INPUT :IF-EXISTS :SUPERSEDE)
;         (LET ((A NIL) (FORM READ-LINE STR))
;           (CASE FORM (OTHERWISE #)))))
; 
; caught STYLE-WARNING:
;   The variable PATH is defined but never used.
; 
; compilation unit finished
;   caught 2 ERROR conditions
;   caught 1 STYLE-WARNING condition
由于代码甚至不编译,并且有几个语法错误,因此很难推测在运行不同的代码时会看到哪些错误

但是很清楚:
char=
需要一个字符。但是在循环中,它可以得到一个非字符的
NIL
参数。如果代码真的能工作…

do
表单的变量列表在每次迭代结束前进行评估。文件中的最后一个字符是
nil
。由于我在varlist中调用了
char=
nil
do
即将终止之前被传递给它

Do
的主体在结束形式之后进行计算,这就是主体中的
char=
没有导致错误的原因。

do
表单的变量列表在每次迭代结束前进行评估。文件中的最后一个字符是
nil
。由于我在varlist中调用了
char=
nil
do
即将终止之前被传递给它


Do
的主体在结束表单之后进行计算,这就是主体中的
char=
没有导致错误的原因。

请复制并粘贴所有代码和错误消息。您当前的代码将产生不同的错误:
form
let
子句已损坏。您确实不应该手动缩进。编辑器应该自己做,或者Lisp自己做。这里的缩进是错误的。WITH-OPEN-FILE后面的零件(参数)需要放在括号中。您的代码只有一个右括号,而左括号是空的。调整您的代码并重新修改代码-但手动调整时,请使用工具。缩进很重要,没有工具就无法可靠地完成缩进。对不起,我不知道如何从emacs的剪贴板粘贴到Firefox。请复制并粘贴所有代码和错误消息。您当前的代码将产生不同的错误:
form
let
子句已损坏。您确实不应该手动缩进。编辑器应该自己做,或者Lisp自己做。这里的缩进是错误的。WITH-OPEN-FILE后面的零件(参数)需要放在括号中。您的代码只有一个右括号,而左括号是空的。调整您的代码并重新修改代码-但手动调整时,请使用工具。缩进很重要,没有工具就无法可靠地完成缩进。对不起,我不知道如何从emacs的剪贴板粘贴到Firefox。