如何将列表中的元素映射到LISP中其他列表中的值
我是lisp编程新手,我正在尝试思考下面的操作 (摘录"0110"(a b c))给我们(a b a) (节选)(11)(abc)给了我们(bbb)如何将列表中的元素映射到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)
我如何思考这个问题以及如何解决它。
(摘录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,这是非常不同的。