Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 在有用户输入的有限循环中执行操作有困难_Loops_Common Lisp_User Input - Fatal编程技术网

Loops 在有用户输入的有限循环中执行操作有困难

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

我在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 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