CesarA 发表于 2022-7-5 18:08:49

了解mapcar

我在附近的一些教程中看过mapcar。在我看来,它对列表中的每个元素都进行了更改。
 
例如(mapcar“1+”(1 2 3))
将返回类似(2 3 4)的值
 

(mapcar“strcase”(a b c))->(a b c)
 
我完全理解这一点。但有时人们使用的功能并不那么清晰,例如
'cdr
 
我真的不明白,因为cdr应该返回列表的第二个元素。这不是我应用于列表的操作,而是返回操作。那么(mapcar的cdr)是如何工作的,它做了什么?

rlx 发表于 2022-7-5 18:25:46

嗨,CesarA,
 
 
您还可以使用foreach item(in)list做这个或那个。我喜欢将cdr视为第二个和剩余的。Mapcar的cdr只是意味着,对于列表中的每个元素,或者,应用函数cdr。如果您的列表只包含单个元素,这将不起作用,但如果您的列表类似于((1“a”)(2“b”)…)然后,该函数将返回一个包含((“a”)(“b”)…)的列表
 
 
如果你使用mapcar的cadr而不是cdr,你会得到(“a”“b”…)
 
 
gr.Rlx

CesarA 发表于 2022-7-5 18:30:11

对不起,我不太明白:
 
mapcar的cadr返回“a”“b”?
 
但是cadr是第三个元素,在((1“a”)(2“b”)…)中没有第三个元素
 
为什么“cdr”会返回((“a”)(“b”)…)(我理解)
但是‘cadr会返回(“a”“b”…)??
 
这是有区别的,但是,我认为这没有意义

rlx 发表于 2022-7-5 18:39:43

 
 
好吧,你自己试试:
 
 



(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

rlx 发表于 2022-7-5 18:49:23

试试这个
 
 



(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

CesarA 发表于 2022-7-5 19:08:08

我会的,谢谢你

satishrajdev 发表于 2022-7-5 19:13:29

浏览以下链接:-
 
http://www.cadtutor.net/forum/showthread.php?80672-lambda函数mapcar应用foreach解释
 
http://www.cadtutor.net/forum/showthread.php?47026-foreach和mapcar之间的差异
页: [1]
查看完整版本: 了解mapcar