乐筑天下

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

[编程交流] 玩mapcar和lambda

[复制链接]

18

主题

111

帖子

93

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
90
发表于 2022-7-5 15:24:03 | 显示全部楼层 |阅读模式
亲爱的程序员
 
 
在使用mapcar功能时,我想知道下一个是否可行
 
我会有一个包含多个列表的列表,即((“ent1”ent2“ent3”)(“ent11”ent22“ent33”))
 
现在我想把它们结合在一起
 
((“ent1”“ent11”)(“Ent2”“ent22”)(“ent3”“ent23”))
 
这很容易做到,但现在我真正想尝试的是
 
 
我们采用相同的列表,但该列表附带未知数量的子列表
在我的例子中,我只取了2个子列表,但因为我从txt中读取,所以它可以是10或100个子列表或介于两者之间的任何数字
 
所以我们开始
 
(setq list1(mapcar‘list(car’(“ent1”“ent2”“ent3”)(“ent11”“ent22”“ent33”))(cadr’((“ent1”“ent2”“ent3”)(“ent11”“ent22”“ent33”))))
 
 
 
当你不知道子列表的数量时,怎么写这个?
i、 e(setq list1(mapcar列表(foreach x列表……)。。。。。。。
 

 
(setq list1(mapcar列表(λ……)。。。。。。。
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 15:28:13 | 显示全部楼层
嗨,DroiteGaucheRightLeft!
 
没有什么特别的,没有错误捕捉(如果你想处理不均匀的子列表,它会变得指数级的复杂,这取决于它需要如何处理)。。。下面是一个如何实现这一点的示例。
 
  1. (defun test (lst / x lst ret)
  2. (setq x 0)
  3. (repeat (length (car lst))
  4.          (foreach itm lst (setq ret (cons (nth x itm) ret)))
  5.          (setq x (1+ x))
  6. )
  7. (reverse ret)
  8. )

按如下方式将列表馈送到函数。。。
 
干杯
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 15:33:47 | 显示全部楼层
  1. (apply 'mapcar (cons 'list <your-list>))

 
  1. _$ (apply 'mapcar (cons 'list '(("ent1" " ent2" "ent3")("ent11" "ent22" "ent33")("ent111" "ent222" "ent333"))))
  2. (("ent1" "ent11" "ent111") (" ent2" "ent22" "ent222") ("ent3" "ent33" "ent333"))
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 15:37:28 | 显示全部楼层
末日!我误读了返回值的格式,一个列表的列表,而不仅仅是一个列表。哦,好吧。
  1. (defun test (lst / x lst ret ret2)
  2. (setq x 0)
  3. (repeat (length (car lst))
  4.          (foreach itm lst (setq ret (cons (nth x itm) ret)))
  5.          (setq x (1+ x))
  6.          (setq ret2 (cons (reverse ret) ret2))
  7.          (setq ret nil)
  8. )
  9. (reverse ret2)
  10. )

 
 
既然你能用复数,为什么还要用复数?
(李做得很好!)
回复

使用道具 举报

18

主题

111

帖子

93

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
90
发表于 2022-7-5 15:38:14 | 显示全部楼层
嗨,杰夫!
 
 
很好的一个名字lol
 
 
现在,我想处理偶数子列表,其余的将稍后提供
谢谢你提供的两个例子,当我需要你提供的第一个时,你永远不知道
 
 
@李·麦克。
 
 
短而有力:-)
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 15:42:35 | 显示全部楼层
李出世了(我想我知道他来自哪里:加里弗雷)
 
不幸的是,我自己做得再好不过了。。。
 
  1.    (mapcar 'list '(1 2 3) '(11 12 13) '(21 23 23))

 
李,什么时候,或者如果你不再需要或使用它,我可以借用你的大脑吗
 
gr.Rlx
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 15:47:49 | 显示全部楼层
 
这听起来像是一个黑色幽默,可能是一个很好的器官捐赠广告。
 
之前我在调查这个
并且认为guy使用的算法似乎有点复杂(顺便说一句,让我想起了Jef的),所以我想知道用LISP做这件事有多难。答案是:一点也不难-
  1. (defun RotateMatrix ( mat )
  2. (setq mat (mapcar 'reverse (apply 'mapcar (cons 'list mat))))
  3. (foreach x mat (print x))
  4. )

 
它像视频中那样旋转:
  1. (RotateMatrix
  2. '(
  3.    (0 1)
  4.    (2 3)
  5. )
  6. )
  7. >>
  8. (2 0)
  9. (3 1)
  10. (RotateMatrix
  11. '(
  12.    (0 1 2)
  13.    (3 4 5)
  14.    (6 7
  15. )
  16. )
  17. >>
  18. (6 3 0)
  19. (7 4 1)
  20. (8 5 2)
  21. (RotateMatrix
  22. '(
  23.    (0 1 2 3)
  24.    (4 5 6 7)
  25.    (8 9 10 11)
  26.    (12 13 14 15)
  27. )
  28. )
  29. >>
  30. (12 8 4 0)
  31. (13 9 5 1)
  32. (14 10 6 2)
  33. (15 11 7 3)

 
然后我记得这项技术(对我来说)是由李和他的数学家演示的-所以当我把这些点连接起来时············································。
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 15:51:58 | 显示全部楼层
 
现在看看谁在说黑色幽默whaha。。。
 
 
 
 
gr.Rlx
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 15:54:47 | 显示全部楼层
谢谢大家的好意和恭维。
 
@Grrr、链表(构建LISP的基础)及其固有的灵活性(与数组的相对刚性相比)非常适合复杂的操作,否则通过交换数组中的元素来实现相对困难。
 
FWIW,有几种方法可以编写“旋转矩阵”函数,包括左旋转和右旋转-
  1. (defun rmat ( m )
  2.    (mapcar 'reverse (apply 'mapcar (cons 'list m)))
  3. )
  4. (defun rmat2 ( m )
  5.    (apply 'mapcar (cons 'list (reverse m)))
  6. )
  7. (defun lmat ( m )
  8.    (apply 'mapcar (cons 'list (mapcar 'reverse m)))
  9. )
  10. (defun lmat2 ( m )
  11.    (reverse (apply 'mapcar (cons 'list m)))
  12. )
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 15:58:33 | 显示全部楼层
 
随着时间的推移,我意识到用LISP操作数据是多么容易,现在我完全理解了切换到另一种编程语言的困难(只是感觉没有那么灵活)。
之前很少有线程向Rlx提及LISP的优势。
但我仍然认为学习更多像Jef这样的“通用”处理是一个很好的做法!提供,由于最终的语言切换。
 
 
 
谢谢李,我从我的档案中找到了这个函数(当时我正试图用它和grread一起找出一些有趣的东西)。
 
主题外:
我左脑只想到旋转一些坐标,
这转化为另一种想法,即使用2D投影+grread,用[W/A/S/D]键“倾斜”投影/透视向上/向下/左/右。
想象一下,看看你的例子#1(在我的脑海里看起来很酷)。
 
您提供的功能可能对其他人也很方便,尤其是对DGRL(从他的兴趣来看,我认为他有潜力成为“我们中的一员”)。
 
DGRL,请注意,李是(最好的?/最好的)列表操纵器之一,所以我们使用的双关语不是偶然的。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 03:19 , Processed in 0.756636 second(s), 83 queries .

© 2020-2025 乐筑天下

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