找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 7184|回复: 46

[研讨] 【趣味】大家看看这段代码的意思

[复制链接]

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-8-19 17:20:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 ll_j 于 2013-8-20 11:20 编辑

  1. ('((x) (apply '+ x)) (mapcar '(list '(x y) '(+ x y)) '(4 5) '(6 7)))


想写点什么,又诸多琐事,难以定心,就先弄一段代码给朋友们玩味解读一下,打趣而已,大家不必认真。
提示:这是关于函数的。
说明:没有奖励,如果能理解,应该对AutoLisp的函数有更新的认识。


答案在2楼,选择后查看

评分

参与人数 3D豆 +12 收起 理由
/db_自贡黄明儒_ + 2 技术引导讨论和指点奖!
wowan1314 + 5 好主题奖!
ayl1004 + 5

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 6530个

财富等级: 富甲天下

 楼主| 发表于 2013-8-19 17:20:32 | 显示全部楼层
本帖最后由 ll_j 于 2013-8-20 11:19 编辑

换一种写法应该更容易明白:
  1. ((lambda(x) (apply '+ x)) (mapcar '(lambda(x y) (+ x y)) '(4 5) '(6 7)))

看出点什么?就是函数的用法。
这里定义了两个临时函数,一个用来替换函数名,一个作为参数。
其实我在这里有点噱头,就是函数名这个临时函数不需要定义,自己apply就可以了,不过作为一种函数的用法,这是应该知道的,比如:
  1. ('((x) (mapcar '(list '(x) '(* x 2)) x)) (mapcar '(list '(x y) '(+ x y)) '(4 5) '(6 7)))

或许换一种写法更容易看清楚,这是我们常规的写法:
  1. (defun tmp(x) (apply '+ x))

  2. (tmp (mapcar '(lambda(x y) (+ x y)) '(4 5) '(6 7)))

那么,还有什么不同?那就是函数lambda的使用,在这里省了(?),是省了,这或许就是函数默认的eval,除了qoute的都是默认eval,于是:
  1. ('((x y) (* x y)) 4 5)

也是合理的了。
我们知道,AutoLisp中函数名和变量名是共用存储空间的,也就是说可以用setq来定义函数:
  1. (setq tp (lambda(x y) (* x y)))
  2. ;;等同于
  3. (defun tp(x y) (* x y))

其实,我们换一种写法:
  1. (setq tt '((x y) (* x y)))

效果也相似。
不过这只是相似,并不是相同,这里定义的tp是函数,而tt仅仅是一个没执行的表达式。
所以,就有在函数中作为参数调用时,因为参数需要的是qoute,只有用list来“变形”的写法。

就不多说了,其实的没用的东西,大家随便看看就行。




论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 862个

财富等级: 财运亨通

发表于 2013-8-19 17:46:23 | 显示全部楼层
先算(mapcar '(list '(x y) '(+ x y)) '(4 5) '(6 7)) 得(10 12)然后最终得22

点评

恩恩,我是抱着左括号之后必须是函数这点看的。 算出 (10 22)后,前面的用 apply '+ 给送到括号里面变成 (+ 10 22) -----> 22了。  详情 回复 发表于 2013-8-19 18:25
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2013-8-19 18:25:17 | 显示全部楼层
zhangq_cai1 发表于 2013-8-19 17:46
先算(mapcar '(list '(x y) '(+ x y)) '(4 5) '(6 7)) 得(10 12)然后最终得22

恩恩,我是抱着左括号之后必须是函数这点看的。

算出 (10 22)后,前面的用 apply '+ 给送到括号里面变成 (+ 10 22) -----> 22了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2013-8-19 18:37:00 | 显示全部楼层
4+5 6+7->9+13->22

点评

把前面的+ 变成 * 命令: ('((x) (apply '* x)) (mapcar '(list '(x y) '(+ x y)) '(4 5) '(6 7))) 120 用你说的,不等于120的。 应该是 (* (+ 4 6)(+ 5 7))) =120  详情 回复 发表于 2013-8-19 18:51
你这个不对,4和5加不到一起去,你试试改下别的数,看看。  详情 回复 发表于 2013-8-19 18:47
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-8-19 18:47:55 | 显示全部楼层

你这个不对,4和5加不到一起去,你试试改下别的数,看看。

点评

一看就不对,故意这样写的,看楼主如何解答,为什么这么喜欢考人?不解决我的求助帖??  详情 回复 发表于 2013-8-19 18:51
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2013-8-19 18:51:31 | 显示全部楼层
newer 发表于 2013-8-19 18:47
你这个不对,4和5加不到一起去,你试试改下别的数,看看。

一看就不对,故意这样写的,看楼主如何解答,为什么这么喜欢考人?不解决我的求助帖??
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-8-19 18:51:39 | 显示全部楼层

把前面的+ 变成 *

命令: ('((x) (apply '* x)) (mapcar '(list '(x y) '(+ x y)) '(4 5) '(6 7)))
120


用你说的,不等于120的。

应该是 (* (+ 4 6)(+ 5 7))) =120
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-19 19:11:07 | 显示全部楼层
本帖最后由 Free-Lancer 于 2013-8-19 19:37 编辑

这个和 LM:acdoc 异曲同工,事关 Lisp 函数定义写法

点评

这个要比 lm:acdoc 那个 难理解的多啊。。 那个我看后 起码是知道点的。 这个一看 完全傻眼了  详情 回复 发表于 2013-8-19 20:56
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3884个

财富等级: 富可敌国

发表于 2013-8-19 19:23:17 | 显示全部楼层
这可真涨见识了,顶
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-19 20:56:47 | 显示全部楼层
Free-Lancer 发表于 2013-8-19 19:11
这个和 LM:acdoc 异曲同工,事关 Lisp 函数定义写法

这个要比 lm:acdoc 那个 难理解的多啊。。

那个我看后 起码是知道点的。 这个一看 完全傻眼了

点评

楼主的函数不就相当于: 没函数名的函数  详情 回复 发表于 2013-8-19 22:06
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-19 21:01:43 | 显示全部楼层
本帖最后由 Free-Lancer 于 2013-8-19 21:04 编辑

这个文章中部分有助于理解
https://acl.readthedocs.org/en/latest/zhCN/ch6-cn.html





评分

参与人数 1D豆 +5 收起 理由
ll_j + 5 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2013-8-19 21:39:36 | 显示全部楼层
LEEmac的程序里很多这种用法((lambda(x)(以X为变量的函数) 一个代表X的值).

点评

仔细看了LEEMAC的程序,的确很多这样的写法  详情 回复 发表于 2013-8-19 22:36
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-8-19 22:06:52 | 显示全部楼层
wowan1314 发表于 2013-8-19 20:56
这个要比 lm:acdoc 那个 难理解的多啊。。

那个我看后 起码是知道点的。 这个一看 完全傻眼了

楼主的函数不就相当于:


  1. ((lambda '(x)
  2.    (apply
  3.      '+
  4.      x
  5.    )
  6. )
  7. (mapcar
  8.    '(list '(x y) '(+ x y))
  9.    '(4 5)
  10.    '(6 7)
  11. )
  12. )


没函数名的函数

点评

他连lambda都没加。 所以费解了 。 是不是说以后都不需要加lambda了。 都按楼主一样写成那样。就是猛一看不习惯。看多了就习惯了  详情 回复 发表于 2013-8-19 22:14
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-19 22:14:10 | 显示全部楼层
newer 发表于 2013-8-19 22:06
楼主的函数不就相当于:

他连lambda都没加。 所以费解了 。

是不是说以后都不需要加lambda了。 都按楼主一样写成那样。就是猛一看不习惯。看多了就习惯了

点评

是啊,lambda 就是哑函数,当初加它就是希望能好理解点吧,不加一样的  详情 回复 发表于 2013-8-19 22:26
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 13:25 , Processed in 0.207788 second(s), 58 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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