LISP数组遍历求助:使用MAPCAR无法正确打印数组内的问题
解决Lisp二维数组遍历与提问统计问题
你的代码存在几个关键问题:
mapcar是列表操作函数,无法直接遍历数组,数组需要用专门的遍历工具(如maparray)或loop循环处理。- 你传给
mapcar的'(question-array)是包含符号的单元素列表,不是数组本身,应直接使用变量question-array。 - 你的
lambda里(print)未指定打印对象,自然无法输出问题内容。
正确遍历数组并打印问题的方法
方法1:使用loop循环(最直观,适合后续扩展)
loop可直接遍历二维数组的每一行,提取问题内容:
(setf question-array (make-array '(8 2) :initial-contents '((1 "How old are you:") (2 "What's your name:") (3 "Do you like Lisp:") (4 "What's your favorite language:") (5 "How many years of coding experience do you have:") (6 "Do you use Emacs:") (7 "Have you used Common Lisp before:") (8 "What's your OS:")))) ;; 遍历数组,打印每个问题 (loop for i from 0 below (array-dimension question-array 0) do (print (aref question-array i 1)))
array-dimension question-array 0获取数组行数,aref question-array i 1取出第i行第2列的问题字符串。
方法2:使用maparray函数
maparray专门用于遍历数组元素,二维数组的顶级元素是子列表,直接提取问题即可:
(maparray (lambda (row) (print (second row))) question-array)
方法3:转数组为列表后用mapcar
若坚持用mapcar,可先将数组转为列表:
(mapcar (lambda (row) (print (second row))) (array-to-list question-array))
实现提问、存储答案与统计分数的完整示例
结合你的最终目标,以下是完整流程代码:
;; 定义带正确答案的问题数组 (setf question-array (make-array '(3 3) :initial-contents '((1 "How old are you (enter number):" "25") (2 "What's your name (enter Alice/Bob):" "Alice") (3 "Do you like Lisp (yes/no):" "yes")))) ;; 存储用户答案的列表 (setf user-answers '()) ;; 遍历提问并收集答案 (loop for i from 0 below (array-dimension question-array 0) for question = (aref question-array i 1) for correct-answer = (aref question-array i 2) do (progn (format t "~a " question) (let ((user-input (read-line))) (push (list question user-input correct-answer) user-answers)))) ;; 统计分数 (setf score 0) (dolist (answer user-answers) (when (string-equal (second answer) (third answer)) (incf score))) (format t "Your final score is: ~d/~d~%" score (length user-answers))
这段代码会逐个提问、读取输入,最后对比正确答案统计分数,string-equal用于忽略大小写的字符串比较,适配不同输入格式。
内容的提问来源于stack exchange,提问作者sow_lene
相关产品推荐
相关产品推荐

