我是lisp编程的新手,我正在考虑以下操作。
(提取'(0 1 0)'(a b c))给我们'(a b a)
(提取'(1 1 1)'(a b c))给我们'(b b b)
我怎么能想到这个以及如何解决它。
答案 0 :(得分:1)
正如Chris Jester-Young所描述的那样,它只返回第一个列表中索引的第二个列表中的元素。编写这样的函数非常简单:
(defun extract (list-1 list-2)
(mapcar (lambda (n) (nth n list-2)) list-1))
CL-USER>(extract '(0 1 0) '(a b c))
(A B A)
CL-USER>(extract '(1 1 1 ) '(a b c))
(B B B)
如果没有这样的索引,它会在那个地方给你NIL
。
CL-USER> (extract '(1 100 1 ) '(a b c))
(B NIL B)
但这不适用于嵌套结构(树)。如果你想要它返回list-2结构中list-2形状的元素,你可以使用一个简单的maptree helper函数,然后做同样的事情:
(defun maptree (fn tree)
(cond
((null tree) tree)
((atom tree) (funcall fn tree))
(t (cons
(maptree fn (first tree))
(maptree fn (rest tree))))))
(defun extract* (list-1 list-2)
(maptree (lambda (n)
(nth n list-2)) list-1))
CL-USER> (extract* '(3 (2 1 (0))) '(a b c d))
(D (C B (A)))
答案 1 :(得分:0)
(extract a b)
会返回a
的副本,其中每个元素都会被该位置的b
元素替换。