首页 > 解决方案 > lisp 的问题并使用迭代进行构造

问题描述

首先,我遇到了这个问题。我生成的代码不是遍历每个单词,而是遍历整个传递的参数。我正在使用 do 循环将信息传递到哈希表中。

(defun set_isa (partOfSpeech &rest words)

(do ((wordVar words))
((null wordVar) nil) 

(putp partOfSpeech word-dict wordVar)
(setf wordVar (cdr wordVar))))

有了这个,我得到了这个结果使用跟踪

(set_isa 'Verb 'Talk 'Run 'jump )

1. Trace: (SET_ISA 'VERB 'TALK 'RUN 'JUMP)
1. Trace: SET_ISA ==> NIL
NIL

当我调用哈希表时,它只添加最后传递的参数

#S(HASH-TABLE :TEST FASTHASH-EQL (VERB . (JUMP)))

标签: lispcommon-lisp

解决方案


欢迎来到 SO。我看到我们的问题存在一些问题,希望能给您一些提示。

缩进

请正确缩进您的代码。这将导致代码更具可读性,并增加其他人可以帮助您的可能性。

(defun set_isa (partOfSpeech &rest words)
  "Put an understandable docstring here!"
  (do ((wordVar words))
      ((null wordVar) nil) 
    (putp partOfSpeech word-dict wordVar)
    (setf wordVar (cdr wordVar))))

你会在这里找到更多关于风格的建议。另请参阅信息选项卡以获取参考集合。

可运行的示例

在我们的函数putp中没有定义。因此,我无法运行您的代码并查看究竟会出现什么错误等。请始终提供完整的示例,并清楚地说明您的期望和得到的结果。的部分hash-table根本不清楚。它从何而来?它在我们的代码中是如何使用的?

做循环

检查初学者参考以了解do其及其亲属的正确语法。do如果您想使用try遍历列表dolist

(dolist (item '(a b c d))
  (print item))

使用do您可以通过此构造实现相同的效果:

(do ((items '(a b c d) (rest items)))
    ((null items))
  (print (first items)))

一开始我似乎很难把括号弄对,但如果你把它背后的逻辑弄对了,它会变得更容易。您不需要该setf零件,因为do它会照顾它。


推荐阅读