我试图将其简化为最小的示例。代码运行没有错误,产生预期的输出。但它给了我一个警告,我的第一个变量是未定义的。似乎 progn 的第二个语句没有“看到”第一个语句的结果。谢谢您的帮助!
(我最初在代码中根本没有 progn 构造,但是在收到此错误后,我添加了它以查看是否会强制按顺序执行 - 但错误是相同的。)
这是代码:
(let ((input (open "input.lisp")))
(progn (defvar var1 (read input))
(defvar arr1 (make-array var1 :initial-contents (read input))))
(close input))
(print var1)
(print arr1)
这些是文件“input.lisp”的内容:
9
(10 8 6 4 2 4 6 8 10)
这是我在执行后从 sbcl 得到的输出(加载“test.lisp”):
; in: DEFVAR ARR1
; (MAKE-ARRAY VAR1 :INITIAL-CONTENTS (READ INPUT))
;
; caught WARNING:
; undefined variable: VAR1
;
; compilation unit finished
; Undefined variable:
; VAR1
; caught 1 WARNING condition
9
#(10 8 6 4 2 4 6 8 10)
T
所以,在我看来,两个定义语句都在执行,但第二个没有“看到”第一个的结果。它仍然正确构造数组,因为它填充了给定的初始内容。但是为什么 var1 还没有定义呢?