Types Lisp-读取文件时Do表单中的类型错误
[SBCL]我正在尝试从一个文本文件中逐字符读取,该文件如下所示: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
: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。