难以在用户输入的有限循环中执行动作

时间:2014-08-31 19:49:05

标签: 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 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

输入一个整数后按下它会挂起。

1 个答案:

答案 0 :(得分:2)

使用编译器有帮助。看看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)),其中包含循环关键字或类型。为什么? loop的文档应该告诉我们。 sum 是数字累积:

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

因此,在 sum 之后,应该有一个表单。您只需将提示和对读取的调用包装起来,例如预测即可生成单个表单:

(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,是双向流   在询问用户的问题时使用。问题应该是   输出到此流,并从中读取答案。