0

我正在尝试创建一个具有符号/令牌和传入列表的函数

然后该函数将检查列表是否包含符号/令牌。如果是,则返回其对应的密钥对,如果不是,则返回 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

我想要返回的是黄色,即密钥对

有人可以帮我解释什么是错的。我对 LISP 很陌生

4

4 回答 4

4
(second (assoc 'banana *pairs*))

YELLOW

编辑:请参阅下面 Joshua Taylor 的评论,以获取有关assoc它使用的关联列表(或简称:alists)的文档和概念(非常简单:alists是由 cons 单元格列表形成的键值数据结构,其中car每个 cons单元格是键,cdr是值)。

关于您自己的代码有什么问题:

在您的条件下if(eq word list),您正在测试您的论点是否word与您的论点相同list。但是您实际上要查找wordwithin list,因此这不是正确的条件。

此外,即使条件为真,您要评估的是(rest(list)). 那是通过调用函数创建的新空列表list的其余部分,而不是您的参数的其余部分list

最后,你用第三个右括号来关闭if表达式。因此,即使其他一切都是正确的(rest(list)),最终结果也将是您的函数的返回值。nil您需要将 移动nil到表达式的括号中if以使其成为 else-consequent,并将if表达式的值作为函数的返回值。

于 2013-10-21T21:05:22.300 回答
1

你正在寻找的是

(defun list-pairs (word list)
  (if list
    (if (eq (caar list) word)
      (cadar list)
      (list-pairs word (cdr list))))))

或者,使用 let 作为一个小的优化:

(defun list-pairs (word list)
  (if list
    (let ((c (car list)))
      (if (eq (car c) word)
        (cadr c)
        (list-pairs word (cdr list))))))

它适用于进行尾调用优化的 Common Lisp 实现;你应该像这样使用它

(list-pairs 'banana *pairs*)

但在 Common Lisp 中,循环宏通常是首选:

(defun list-pairs (word list)
  (loop for c in list
    when (eq (car c) word)
    return (cadr c)))
于 2013-10-21T21:00:01.110 回答
1

作为另一种选择:

(defun list-pairs (word list)
  (dolist (p list)
    (if (eq word (first p))
      (return (second p)))))

(defparameter *pairs* 
  '((apple green)
    (banana yellow)
    (grape purple)))

(list-pairs 'banana *pairs*)
YELLOW
于 2013-10-21T21:11:32.157 回答
0

你的任务给我留下了一些问题。

1.) 你的函数应该有一个符号。但是你为什么这样称呼它:(list-pairs '(banana) *pairs*)?还(list-pairs 'banana *pairs*)不够吗?

2.) 您是否只想获得配对中第一个元素的匹配项?即你想要符号banana和相同的结果yellow吗?

如果您只想搜索第一个元素,Rörd 已经提到过assoc,这将是完美的。如果你想检查这对的两个元素,你可以remove-if-not试一试。

(defun list-pairs (word list)
  (remove-if-not
   #'(lambda (sublist) (member word sublist))
   list))
于 2013-10-21T21:41:44.357 回答