Loops 在有用户输入的有限循环中执行操作有困难
我在Mac上使用Allegro CL Express,我不确定程序是否有问题,或者我的代码格式不好。我尝试获取4个用户输入整数,然后在输入最后一个值后将它们相加 预期结果:Loops 在有用户输入的有限循环中执行操作有困难,loops,common-lisp,user-input,Loops,Common Lisp,User Input,我在Mac上使用Allegro CL Express,我不确定程序是否有问题,或者我的代码格式不好。我尝试获取4个用户输入整数,然后在输入最后一个值后将它们相加 预期结果: (stuff) Enter a number: 4 Enter a number: 3 Enter a number: 2 Enter a number: 1 10 以下是我目前拥有的: (defun stuff () (loop repeat 4 sum (format t "Enter a
(stuff)
Enter a number: 4
Enter a number: 3
Enter a number: 2
Enter a number: 1
10
以下是我目前拥有的:
(defun stuff ()
(loop repeat 4
sum (format t "Enter a number: ")
(parse-integer (read-line))))
编辑:
经过一番巨大的帮助,我得到了以下几点:
CG-USER(18): (defun stuff ()
(loop repeat 4
sum (progn
(format t "Enter a number: ")
(parse-integer (read-line)))))
STUFF
CG-USER(19): (stuff)
Enter a number: 1
输入整数并按return键后,它将挂起。使用编译器帮助。查看SBCL在评估您的表格时所说的内容:
CL-USER> (defun stuff ()
(loop repeat 4
sum
(format t "Enter a number: ")
(parse-integer (read-line))))
; in: DEFUN STUFF
; (LOOP REPEAT 4
; SUM (FORMAT T "Enter a number: ") (PARSE-INTEGER (READ-LINE)))
;
; caught ERROR:
; during macroexpansion of (LOOP REPEAT 4 ...). Use *BREAK-ON-SIGNALS* to
; intercept.
;
; (PARSE-INTEGER
; (READ-LINE)) found where a LOOP keyword or LOOP type keyword expected
; current LOOP context: SUM (FORMAT T "Enter a number: ") (PARSE-INTEGER
; (READ-LINE)).
;
; compilation unit finished
; caught 1 ERROR condition
STUFF
最重要的是
; (PARSE-INTEGER
; (READ-LINE)) found where a LOOP keyword or LOOP type keyword expected
; current LOOP context: SUM (FORMAT T "Enter a number: ") (PARSE-INTEGER
; (READ-LINE)).
所以它得到了(PARSE-INTEGER(READ-LINE)),其中需要循环关键字或类型。为什么?的文档应该告诉我们sum是一种数值累加:
numeric-accumulation::= { count | counting | sum |
summing | maximize | maximizing |
minimize | minimizing }
{form | it}
[into simple-var] [type-spec]
因此,在求和之后,应该有一个表单。您只需将提示和对的调用包装为read line,例如,progn即可生成一个表单:
(defun stuff ()
(loop repeat 4
sum (progn
(format *query-io* "Enter a number: ")
(parse-integer (read-line *query-io*)))))
还要注意,我使用流进行输入和输出。您不必这样做,但它可能更健壮,因为:
*查询io*的值称为查询I/O,是一个双向流
在向用户提问时使用。问题应该是
输出到此流,并从中读取答案
你是一个巫师,我欠你的债(我相信这里有很多人)。谢谢你,也很抱歉你的无礼。@Aaron养成看HyperSpec的习惯是个好习惯。在CL的一些更复杂的部分(例如循环)中尤其如此,因为实现很容易有细微的差异(或bug),这样在一个地方工作的代码可能在另一个地方不工作。这就是为什么很容易发现这个特定的bug;我以前遇到过类似的事情,不得不破译同样类型的信息快乐的口齿不清!我可能很快会说一点,将在上面公布结果。由于未知原因,在输入第一个整数后,它挂起在程序中。我中断了调试器,得到了以下信息:Break:创建了一个新进程来显示此对话框,并将每个线程的进程数量设置为一个较小的值(0.1秒),以便于调试繁忙的线程。量子从这个中断返回时将返回到它们以前的值。错误:此字符串中有垃圾:“1Break:创建了一个新进程以显示此对话框并设置进程的数量”。[条件类型:PARSE-ERROR]老实说,我认为可能是ACL——GTK也坏了。请注意,在portable Common Lisp中,您需要调用
finish output
,以确保缓冲输出完成。在这里,您需要在调用后调用它,然后调用format
。