我在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,是一个双向流以便在向用户提问时使用。问题应该是输出到此流,并从中读取答案。