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



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

它只是在我输入一个整数并按回车键后挂起。

使用编译器会有所帮助。查看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)),其中需要一个循环关键字或类型。为什么?循环的文档应该告诉我们。总和是一个数字累加:

numeric-accumulation::= { count | counting | sum |
                          summing | maximize | maximizing | 
                          minimize | minimizing }
                        {form | it} 
                        [into simple-var] [type-spec] 

因此,在之后,应该有一个形式。您只需要包装您的提示和对的调用即可读取行,例如,程序即可生成单个表单:

(defun stuff ()
  (loop repeat 4
        sum (progn 
              (format *query-io* "Enter a number: ")
              (parse-integer (read-line *query-io*)))))

还要注意,我使用流*query io*进行输入和输出。您不需要来做到这一点,但它可能更健壮,因为:

*query io*的值,称为查询I/O,是一个双向流以便在向用户提问时使用。问题应该是输出到此流,并从中读取答案。

相关内容

  • 没有找到相关文章

最新更新