jackyieman 发表于 2022-7-5 20:15:17

关于“应用”的问题

大家好。
我有一个关于“应用”和“地图车”的问题。
 
请查看以下代码:

(setq b '((0 1 2) (3 4 5) (6 7 ))
(apply 'mapcar (cons 'list b))

它返回:((0 3 6)(1 4 7)(2 5 8))
 
它是如何工作的?
 
 
下一个问题:

(setq a '(1 2 3 4 5 6 7 8 9 0))
(apply 'mapcar (cons 'list (list a (cdr a))))

它返回:((1 2)(2 3)(3 4)(4 5)(5 6)(6 7)(7 8)(8 9)(9 0))
 
它是如何工作的?

Tharwat 发表于 2022-7-5 20:29:33

欢迎来到CADTutor。
 
希望我能像你一样清楚地描述它们
 
第一个函数apply在列表上实现mapcar函数,mapcar函数迭代每个列表的每个元素,并使用cons和list函数将它们收集在列表中。
 
第二个问题是使用apply函数实现mapcar函数,分别获得列表的第一项和第二项,我可以以递归方式将其作为替代函数提供给您。
 
测试上述功能:
 

(_list '(1 2 3 4 5 6 7 8 9 0))

;; Returns
((1 2) (2 3) (3 4) (4 5) (5 6) (6 7) (7(8 9) (9 0))

jackyieman 发表于 2022-7-5 20:35:27

谢谢你,塔瓦先生!
 
但我仍然对一些细节感到困惑。
第一
我和foreach一样知道mapcar函数。在代码1中,为什么下一个值是“3”而不是“1”?
请看其他示例:

(setq lst '((3 4 5) (0 1 2) (6 7 ))
(apply 'mapcar (cons 'min lst))

结果显示(0 1 2)
为什么不是(3 0 6)?
 
 
第二
为什么要在列表的前面添加列表(使用apostrope表示不执行),而使用apply可以收集列表?
 
谢谢

Tharwat 发表于 2022-7-5 20:40:56

 
因为mapcar函数首先遍历目标列表的每个第一个元素,然后遍历第二个元素,最后遍历第三个元素。。。。直到最后。
 
因为目标列表的最小值由三个元素组成,结果是三个元素,包括最小值。
 
 
mapcar函数需要的是,第一个apply函数需要一个函数作为第一个参数,然后mapcar函数也需要一个函数作为第一个参数。
 
我很高兴你的问题,因为这也刷新了我对前面提到的函数的记忆

jackyieman 发表于 2022-7-5 20:46:47

谢谢你!
经过你的解释,我已经清楚地了解了那些功能!

Tharwat 发表于 2022-7-5 20:54:21

 
很高兴听到这个消息,非常欢迎你。
 
继续练习函数以熟悉它们,如果有一天你注意到某个函数做了比你更重要的事情,不要感到惊讶或恐慌
用于查看或了解示例一是entdel函数。

Lee Mac 发表于 2022-7-5 21:03:25

 
考虑一下:
(apply 'mapcar (cons 'list '((0 1 2) (3 4 5) (6 7 )))与:
(mapcar 'list '(0 1 2) '(3 4 5) '(6 7 )其评估方式与:
(list (list 0 3 6) (list 1 4 7) (list 2 5 )
返回:
((0 3 6) (1 4 7) (2 5 )

jackyieman 发表于 2022-7-5 21:13:50

也谢谢你,李先生!
 
我试了另一个例子,真的很神奇。
但是为什么要使用apply和mapcar,为什么不只是使用mapcar?
这有什么原因吗?快得多?
 
谢谢

Lee Mac 发表于 2022-7-5 21:22:40

 
不客气!
 
 
所需的函数取决于输入数据的格式、要执行的操作以及返回的列表所需的格式-在您的特定示例中,如果三个元素的每个列表嵌套在父列表中,则该列表将作为单个参数提供给mapcar,并且不会返回相同的结果:
_$ (mapcar 'list '((0 1 2) (3 4 5) (6 7 ))
(((0 1 2)) ((3 4 5)) ((6 7 ))
因此,应用函数用于构造等价于以下内容的表达式:
(mapcar 'list '(0 1 2) '(3 4 5) '(6 7 )
页: [1]
查看完整版本: 关于“应用”的问题