You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:17:25