乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 31|回复: 6

[编程交流] 了解mapcar

[复制链接]

17

主题

72

帖子

55

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2022-7-5 18:08:49 | 显示全部楼层 |阅读模式
我在附近的一些教程中看过mapcar。在我看来,它对列表中的每个元素都进行了更改。
 
例如(mapcar“1+”(1 2 3))
将返回类似(2 3 4)的值
 

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

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 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
回复

使用道具 举报

17

主题

72

帖子

55

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2022-7-5 18:30:11 | 显示全部楼层
对不起,我不太明白:
 
mapcar的cadr返回“a”“b”?
 
但是cadr是第三个元素,在((1“a”)(2“b”)…)中没有第三个元素
 
为什么“cdr”会返回((“a”)(“b”)…)(我理解)
但是‘cadr会返回(“a”“b”…)??
 
这是有区别的,但是,我认为这没有意义
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 18:39:43 | 显示全部楼层
 
 
好吧,你自己试试:
 
 
  1. (setq lst '((1 "a")(2 "b")(3 "c")))
  2. (mapcar 'cdr lst)
  3. (mapcar 'cadr lst)

 
 
cdr将返回一个删除了第一个元素的列表(第二个和剩余的)
cadr将给出第二部分的第一个元素,等于(car(cdr…)
 
 
列表和“原子”之间有很大区别,(列表1 2 3 4)与(列表(列表1 2)(列表3 4))不同
 
 
第一个是4个原子的列表,第二个是2个列表,每个列表包含2个原子
 
 
gr.Rlx
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 18:49:23 | 显示全部楼层
试试这个
 
 
  1. (defun c:tst ( / lst1 lst2 result1 result2 result3)
  2. ;age of jack and jill and their dog Bruno
  3. (setq lst1 '(("Jack" 22)("Jill" 25)("Bruno" 5))); -> (("Jack" 22) ("Jill" 25) ("bruno" 5))
  4. (setq result1 (car lst1)) ; -> ("Jack" 22)
  5. (setq result2 (cdr lst1)) ; -> (("Jill" 25) ("bruno" 5))
  6. (setq result3 (cadr lst1)); -> ("Jill" 25)
  7. (setq lst2 (list 1 2 3 4 5)); -> ( 1 2 3 4 5)
  8. (setq result1 (car lst2)) ; -> 1
  9. (setq result2 (cdr lst2)) ; -> (2 3 4 5)
  10. (setq result3 (cadr lst2)); -> 2 , same as (car (cdr lst2))
  11. )

 
 
gr.Rlx
回复

使用道具 举报

17

主题

72

帖子

55

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2022-7-5 19:08:08 | 显示全部楼层
我会的,谢谢你
回复

使用道具 举报

55

主题

402

帖子

357

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
274
发表于 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之间的差异
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-12 19:37 , Processed in 0.642289 second(s), 66 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表