如何将列表中的元素映射到LISP中其他列表中的值

如何将列表中的元素映射到LISP中其他列表中的值,lisp,Lisp,我是lisp编程新手,我正在尝试思考下面的操作 (摘录"0110"(a b c))给我们(a b a) (节选)(11)(abc)给了我们(bbb) 我如何思考这个问题以及如何解决它。(摘录a b)返回一个a的副本,其中每个元素在该位置被b的元素替换。如Chris Jester Young所述,它只返回第一个列表索引处第二个列表中的元素。编写这样的函数非常简单: (defun extract (list-1 list-2) (mapcar (lambda (n) (nth n list-2)

我是lisp编程新手,我正在尝试思考下面的操作

(摘录"0110"(a b c))给我们(a b a)

(节选)(11)(abc)给了我们(bbb)


我如何思考这个问题以及如何解决它。

(摘录a b)
返回一个
a
的副本,其中每个元素在该位置被
b
的元素替换。

如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-1结构中成形的list-2元素,可以使用简单的maptree辅助函数,然后执行相同的操作:

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

Scott Hunter的回答描述了函数的正确功能。如果您希望实现它,请以某种适当的方式将
mapcar
nth
(公共Lisp)或
map
list ref
(Scheme)组合在一起。它就像一个bc分别被索引为0 1 2,如果第一个列表是0 1 0,第二个列表是m n o,那么函数的输出将是m n m。我想创建一个函数来执行我上面描述的功能。我对lisp的工作原理感到非常困惑,我已经习惯了java,这是非常不同的。