我在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
输入一个整数后按下它会挂起。
答案 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,是双向流 在询问用户的问题时使用。问题应该是 输出到此流,并从中读取答案。