我是LISP的新手所以我对此并不擅长...所以我的问题是,我已经获得了一个结构(列表列表),我的工作是创建一个函数来重现第二个每个子列表中的项目(从0开始计数)。所以最后我想回来(水果代理院)。
我可以执行遍历列表的基本递归调用,但我似乎无法弄清楚如何获取子列表中的第二项。
列表结构:
(defparameter *jack*
'((orange#8 apple fruit basment)
(pear#12 mango fruit basment)
(jones rabbit agent closet)
(jack dog agent yard)
))
我到目前为止的代码:
(defun attempt(*data*)
(cond ((null *data*)
nil
)
((attempt (rest *data*)))
))
我在想的是我应该首先使用列表子列表进行迭代和休息,但就像我说的那样,我无法理解。救命?
答案 0 :(得分:3)
这很可能是您正在寻找的:
(mapcar #'cadr *jack*)
答案 1 :(得分:3)
CL-USER> (mapcar #'caddr *jack*)
(FRUIT FRUIT AGENT AGENT)
编辑:如果您想练习递归方法,请尝试:
(defun attempt (list-of-lists)
(if (null list-of-lists) nil
(cons (third (car list-of-lists))
(attempt (cdr list-of-lists)))))
EDIT2:Tail-recursively:
(defun attempt-tail (list-of-lists)
(labels ((iter (rest ans)
(if (null rest) (nreverse ans)
(iter (cdr rest) (push (third (car rest)) ans)))))
(iter list-of-lists nil)))
EDIT3:当我在这里时,这是循环版本:
(loop for list in *jack* collect (third list))
答案 2 :(得分:1)
是的,你可以为这个过程定义你想要一个尾递归过程;
(defun nths (n l)"returns list of nths of a list of lists l"
(nths-aux n l '()))
(defun nths-aux (n l A)
(if (null l) A;or (reverse A)
(nths-aux n (cdr l) (cons (nth n (car l)) A))))