明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2452|回复: 18

[基础] mapcar 图解。lisp 基础知识图解系列。

  [复制链接]
发表于 2022-5-30 17:47 | 显示全部楼层 |阅读模式
本帖最后由 vitalgg 于 2022-6-3 05:24 编辑

mapcar


最常使用的是 mapcar ,接受一个函数以及一个或多个列表,并返回把函数应用至每个列表的元素的结果,直到有的列表没有元素为止。


mapcar 后跟的 函数 需要几个参数,再后面就需要几个 作为参数的列表,如下面的代码,函数 需要两个参数,那么后面就需要跟两个表,参数表A和参数表B


返回结果也是一个表。


  1. (defun 函数 (参数A 参数B) ...) ;; 函数 定义,有两个参数
  2. (mapcar '函数 参数表A 参数表B) ;; 返回 结果表

apply

autolisp 的 apply 接受两个参数 ,第一个是 quote 的 函数本体(类型为函数的符号或 lambda 匿名函数,第二个是一个表,这个表内元素个数须与函数所需的参数一致。


  1. (defun fun (para1 para2 para3) ...) ;; 假定定义的 fun 有 3 个参数。
  2. (apply 'fun '(para1 para2 para3)) ;; apply fun 后面的表中 元素也需要 3 个, 与 fun 所需的参数一致。
  3. ;;等价于
  4. (fun para1 para2 para3)



全文: https://gitee.com/atlisp/atlisp- ... B%E9%98%B6/lisp.org

@lisp开源项目: https://gitee.com/atlisp



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-5-31 08:36 | 显示全部楼层
可以mpacar和 apply放在一起讲,相似和不同,可以更好的理解两个函数的用法,mapcar是遍历参数去执行函数,例如(mapcar '(lambda(x y)(+ x y)) '(1 2 3)'(4 5 6)),返回的是(1+4 2+5 3+6)也就是(5 7 9)。而apply是将所有的参数去执行函数,例如(apply '+ '(1 2 3 4 5 6)),返回的是1+2+3+4+5+6也就是21。其它用法大神来补充。
回复 支持 2 反对 0

使用道具 举报

发表于 2022-5-31 21:18 | 显示全部楼层
本帖最后由 e2002 于 2022-5-31 21:24 编辑

mapcar 你可以理解为一台可变加工程序(也就是mapcar的那个函数参数)的食品加工机,投入的是一份份的原料,例如:若干个(比如100个,后面的其他原料数量也是一样的100份)面粉团,若干份糖,若干份巧克力,若干个鸡蛋,通过使用的的“做面包函数”这个特定程序,这台机器最后做出来了若干个(这里就是100个)面包。

如果换成“做包子”程序,输入各种做包子的“原料”(就是那些参数列表),最后出来的就是一批包子。
回复 支持 1 反对 0

使用道具 举报

发表于 2022-5-31 22:10 | 显示全部楼层
本帖最后由 wzg356 于 2022-5-31 23:06 编辑

(mapcar fun lst1 lst2....)r的执行过程及结果理解
也确实是这样

结果理解
即依次把表lst1 lst2....的原子作为函数fun的参数1 参数2....
并依次执行(fun 参数1 参数2....)
并以表的形式顺序列出执行结果
直观描述结果就是
(mapcar fun lst1 lst2....)
===
(list
        (fun (nth 0 lst1)(nth 0 lst2).....)
        (fun (nth 1 lst1)(nth 1 lst2).....)
        ......依次类推
        次数为lst1 lst2....的最小长度        
)

执行(fun 参数1 参数2....)次数/结果表取决于lst1 lst2....的最小长度
即取决于lst1 lst2....能得到几组合法的fun参数1 参数2....

能执行的前提是lst1 lst2....的原子符合fun相应位置参数规则(fun 参数1 参数2....)

过程理解
(mapcar fun lst1 lst2....)
执行过程如下
=====
(setq lst nil)
(repeat (setq n(min (length lst1)(length lst2)....))
        (setq  n(1- n))
        (setq lst(cons (fun(nth n lst1)(nth n lst2)....) lst))        
)

-------例如------------------
(setq lst1(list -3 2 0 -2.35))
(setq lst2(list 1 2 3 4 5))

(mapcar 'abs lst1)
===
(repeat (setq lst nil n(min (length lst1)))
        (setq  n(1- n) lst(cons (abs(nth n lst1)) lst))        
)
例1
(mapcar 'abs lst1)
===
(repeat (setq lst nil n(min (length lst1)))
        (setq  n(1- n) lst(cons (abs(nth n lst1)) lst))        
)

例2
(mapcar '+ lst1 lst2)
===
(repeat (setq lst nil n(min (length lst1)(length lst2)))
        (setq  n(1- n) lst(cons (+ (nth n lst1) (nth n lst1)) lst))        
)

函数加一个计数器k验证执行过程
(setq k 0)
(mapcar '(lambda(x)(setq k(1+ k))(abs x)) lst1)
!k看看
===
(repeat (setq k 0 lst nil n(min (length lst1)))
        (setq  k(1+ k) n(1- n) lst(cons (abs(nth n lst1)) lst))        
)
!k看看








发表于 2022-5-31 06:57 | 显示全部楼层
这部分感觉讲的不够详细!大佬加油!
发表于 2022-5-31 07:44 | 显示全部楼层

发表于 2022-5-31 16:35 | 显示全部楼层
学习一下知识
发表于 2022-5-31 20:09 | 显示全部楼层
学习一下!支持!
 楼主| 发表于 2022-6-2 21:28 | 显示全部楼层
回帖是一种美德

@lisp 开源项目文档: https://gitee.com/atlisp/atlisp-docs

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-3 15:46 , Processed in 0.461149 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表