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

Lisp中do循环构造迭代异常问题求助

问题分析与修复方案

你的问题出在循环中没有逐个提取单词,而是直接传入了剩余的整个列表,再加上每次调用putp时覆盖了哈希表中对应词性的值,导致最终只保留了最后一个单词。

原代码的问题点

  1. 循环变量处理错误:do ((wordVar words)) 中wordVar初始化为整个words列表(比如调用时的'(Talk Run Jump)),每次循环你传入putp的是整个wordVar,而不是单个单词。
  2. 值被覆盖:每次调用putp都会把partOfSpeech对应的哈希表值替换成当前的wordVar,所以最后一次循环传入'(Jump)后,之前的所有值都被覆盖了。

修复后的代码

假设word-dict是你定义的哈希表,我们修改循环逻辑,逐个提取单词并追加到对应词性的列表中:

(defun set_isa (partOfSpeech &rest words)
  (do ((word-list words (cdr word-list)))
      ((null word-list) nil)
    ; 取出当前迭代的单个单词
    (let ((current-word (car word-list)))
      ; 把单词追加到对应词性的列表中(如果没有则创建新列表)
      (setf (gethash partOfSpeech word-dict)
            (cons current-word (gethash partOfSpeech word-dict nil))))))

如果你的putp是自定义函数(用于操作哈希表),那只需要修改传入的参数为单个单词即可:

(defun set_isa (partOfSpeech &rest words)
  (do ((wordVar words (cdr wordVar)))
      ((null wordVar) nil)
    ; 传入单个单词而非整个列表
    (putp partOfSpeech word-dict (car wordVar))
    (setf wordVar (cdr wordVar))))

修复后的效果

调用(set_isa 'Verb 'Talk 'Run 'Jump)后,哈希表中Verb对应的值会是(Jump Run Talk)(如果用cons追加是逆序,若需要正序可以用append,但cons效率更高),而不是仅保留最后一个单词。

内容的提问来源于stack exchange,提问作者user33plus1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 12:12:46