从lisp中的列表列表中获取元素

时间:2015-05-22 21:31:44

标签: lisp elisp common-lisp

我是lisp的初学者。 我操纵列表清单: ((name1,second)(name2,second2))

我的函数的目标是获取列表的第二个元素,其名称为第一个节点。

例如: 我的列表是:((name1,second1)(name2,second2)) getelement list name1应返回second1。

(defun getelement (list name)
  (if (eq list '())
    (if (string= (caar list) name)
      (car (car (cdr list)))
      (getelement (cdr list) name)
    )
    ()
  )
)

但是我收到了这个错误。我真的不明白我的代码发生了什么。我试着把'之前的表达......

Error: The variable LIST is unbound.
Fast links are on: do (si::use-fast-links nil) for debugging
Error signalled by IF.
Backtrace: IF

2 个答案:

答案 0 :(得分:3)

  1. if子句的顺序错误。
  2. 当字符串匹配时,您将获取下一个元素(cdr)而不是匹配元素(car)
  3. 这应该有效:

    (defun getelement (list name)
         (if (eq list '()) ;end of list,...
             '() ;return empty list
             (if (string= (caar list) name) ;matches,
                 (car (car list))  ;take the matching element
                 (getelement (cdr list) name))))
    

答案 1 :(得分:1)

 (defun get-element (list name)
    (cadr (assoc name list :test #'string=)))