了解mapcar
我在附近的一些教程中看过mapcar。在我看来,它对列表中的每个元素都进行了更改。例如(mapcar“1+”(1 2 3))
将返回类似(2 3 4)的值
和
(mapcar“strcase”(a b c))->(a b c)
我完全理解这一点。但有时人们使用的功能并不那么清晰,例如
'cdr
我真的不明白,因为cdr应该返回列表的第二个元素。这不是我应用于列表的操作,而是返回操作。那么(mapcar的cdr)是如何工作的,它做了什么? 嗨,CesarA,
您还可以使用foreach item(in)list做这个或那个。我喜欢将cdr视为第二个和剩余的。Mapcar的cdr只是意味着,对于列表中的每个元素,或者,应用函数cdr。如果您的列表只包含单个元素,这将不起作用,但如果您的列表类似于((1“a”)(2“b”)…)然后,该函数将返回一个包含((“a”)(“b”)…)的列表
如果你使用mapcar的cadr而不是cdr,你会得到(“a”“b”…)
gr.Rlx 对不起,我不太明白:
mapcar的cadr返回“a”“b”?
但是cadr是第三个元素,在((1“a”)(2“b”)…)中没有第三个元素
为什么“cdr”会返回((“a”)(“b”)…)(我理解)
但是‘cadr会返回(“a”“b”…)??
这是有区别的,但是,我认为这没有意义
好吧,你自己试试:
(setq lst '((1 "a")(2 "b")(3 "c")))
(mapcar 'cdr lst)
(mapcar 'cadr lst)
cdr将返回一个删除了第一个元素的列表(第二个和剩余的)
cadr将给出第二部分的第一个元素,等于(car(cdr…)
列表和“原子”之间有很大区别,(列表1 2 3 4)与(列表(列表1 2)(列表3 4))不同
第一个是4个原子的列表,第二个是2个列表,每个列表包含2个原子
gr.Rlx 试试这个
(defun c:tst ( / lst1 lst2 result1 result2 result3)
;age of jack and jill and their dog Bruno
(setq lst1 '(("Jack" 22)("Jill" 25)("Bruno" 5))); -> (("Jack" 22) ("Jill" 25) ("bruno" 5))
(setq result1 (car lst1)) ; -> ("Jack" 22)
(setq result2 (cdr lst1)) ; -> (("Jill" 25) ("bruno" 5))
(setq result3 (cadr lst1)); -> ("Jill" 25)
(setq lst2 (list 1 2 3 4 5)); -> ( 1 2 3 4 5)
(setq result1 (car lst2)) ; -> 1
(setq result2 (cdr lst2)) ; -> (2 3 4 5)
(setq result3 (cadr lst2)); -> 2 , same as (car (cdr lst2))
)
gr.Rlx 我会的,谢谢你 浏览以下链接:-
http://www.cadtutor.net/forum/showthread.php?80672-lambda函数mapcar应用foreach解释
http://www.cadtutor.net/forum/showthread.php?47026-foreach和mapcar之间的差异
页:
[1]