【发布时间】:2011-09-27 18:09:34
【问题描述】:
我已尝试将其简化为最小示例。代码运行没有错误,产生预期的输出。但它给了我一个警告,我的第一个变量是未定义的。似乎 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 还没有定义呢?
【问题讨论】:
-
您应该始终用耳罩包围词汇变量。您应该称它们为 var1 和 arr1。否则你会遇到麻烦。而且我不想读你的代码。
-
不知道你说的耳罩是什么意思?我只调用变量是因为我希望这个最小的工作示例清晰。 [...编辑掉了等等等等...]。编辑:我查了一下耳罩。谢谢你的建议。我遇到的问题似乎是a)实际上我的所有变量都需要是全局的(“词法”?),或者b)我只想将所有内容包装在巨大的嵌套let语句中。有没有好的中间立场?
-
耳罩是变量名周围的星星。毫无疑问,您之前偶然发现了它们。您不必相信我的话,而是阅读真正专业人士 (Nikodemus) 的意见:random-state.net/log/3498750808.html。
-
哦,是的,我看到耳罩很好,但如果这些变量如此特殊,它会让我觉得我太多了......再次感谢您的建议。
-
whoplisp 有点困惑。按照惯例,special 变量(由
defvar声明)获得耳罩,而不是词法变量(由let声明)。这只是一个约定,所以如果你不喜欢它,你不必遵循它,但如果你需要阅读其他 Lisp 程序员编写的代码,则值得了解。
标签: common-lisp let