我正在尝试创建一个函数,其中有一个符号/ token 和一个传入的列表
然后该函数将检查列表是否包含符号/标记。如果是则返回其对应的 key 对,如果不是则返回nul
我做了一个 defparameter 是:
(defparameter *pairs*
'((apple green)
(banana yellow)
(grape purple)))
然后我做了一个函数来完成这个任务:
(defun list-pairs (word list)
(if (eq word list)
(rest(list)))
nil))
这样执行的函数:(list-pairs '(banana) *pairs*)
我一直得到 nul
我想要返回的是黄色的,即 key 对
谁能帮我解释一下哪里出了问题。我对 LISP 很陌生
最佳答案
(second (assoc 'banana *pairs*))
给予
YELLOW
编辑:有关 assoc
的文档,请参阅下面 Joshua Taylor 的评论以及与之一起工作的关联列表(或简称:alists)的概念(非常简单:alists 是由 cons 单元列表形成的键值数据结构,其中每个 cons 单元格的 car
是键,cdr
是值)。
关于自己的代码有什么问题:
在您的 if
的情况下: (eq word list)
,你正在测试你的论点是否word
与你的论点相同 list
.但你实际上想要寻找 word
在 list
内,所以这不是正确的条件。
此外,即使条件为真,您随后评估的也是 (rest(list))
.这是一个新的空列表的其余部分,通过调用函数 list
创建。 ,而不是你的论点的其余部分list
.
最后,您要关闭 if
之后的表达 (rest(list))
第三个右括号在那里。因此,最后的 nil
将是您的函数的返回值,即使其他一切都是正确的。您需要移动 nil
放入 if
的括号中表达式使其成为 else-consequent,以及 if
的值expression 函数的返回值。
关于list - Lisp - 检查符号是否在列表列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19504261/