2015-05-22 150 views
1

我是lisp的初學者。 ((name1,second)(name2,second2))從lisp列表中獲取元素

我的函數的目標是獲取列表的第二個元素名稱作爲它的第一個節點。

例如: 我的列表是:((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 
+0

什麼是節點列表? – Bill

+0

@Bill對不起,我更改了變量的名稱,但忘記了這個。 nodelist是list(參數)。 – anothertest

+0

當您使用正確的變量名稱時它是否提供錯誤消息?如果是這樣的話:使用什麼lisp,以及如何調用你的函數? –

回答

1
(defun get-element (list name) 
    (cadr (assoc name list :test #'string=))) 
3
  1. 的,如果條款是錯誤的順序。
  2. 當字符串匹配,你正在服用的下一個元素(CDR),而不是匹配到的元素(車)

這應該工作:

(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)))) 
+0

該函數應該返回匹配的元素_following_,即(car(cdr(car list)))',或者更好的'(second(first list))''。 –