list - Lisp - 检查符号是否在列表列表中

标签 list if-statement functional-programming lisp common-lisp

我正在尝试创建一个函数,其中有一个符号/ 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 .但你实际上想要寻找 wordlist 内,所以这不是正确的条件。

此外,即使条件为真,您随后评估的也是 (rest(list)) .这是一个新的空列表的其余部分,通过调用函数 list 创建。 ,而不是你的论点的其余部分list .

最后,您要关闭 if之后的表达 (rest(list))第三个右括号在那里。因此,最后的 nil将是您的函数的返回值,即使其他一切都是正确的。您需要移动 nil放入 if 的括号中表达式使其成为 else-consequent,以及 if 的值expression 函数的返回值。

关于list - Lisp - 检查符号是否在列表列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19504261/

相关文章:

types - 什么是 "vocabulary types",存在多少?

r - 如何从列表中获取变量名

r - 遍历数据框并根据条件更改值 [R]

xslt - 识别 XSLT 中的第一个循环运行

lambda - 如何将 let* 表达为 lambda 表达式(不是常规的 let)

c++ - 如何使用存储在 c++ 中的 std vector 中的 std::list 迭代器制作复制安全容器?

python - 如何从 float 列表中获取 python 中整数的最大公约数?

C++ 添加到包含 Char[] 作为参数的链表

if-statement - 解析 Haskell 代码中输入 ‘if’ 的错误