Lisp中do循环构造迭代异常问题求助
问题分析与修复方案
你的问题出在循环中没有逐个提取单词,而是直接传入了剩余的整个列表,再加上每次调用putp时覆盖了哈希表中对应词性的值,导致最终只保留了最后一个单词。
原代码的问题点
- 循环变量处理错误:
do ((wordVar words))中wordVar初始化为整个words列表(比如调用时的'(Talk Run Jump)),每次循环你传入putp的是整个wordVar,而不是单个单词。 - 值被覆盖:每次调用
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
相关产品推荐
相关产品推荐

