明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1872|回复: 3

关于eval、mapcar和foraech的用法困惑?

[复制链接]
发表于 2012-12-15 23:37 | 显示全部楼层 |阅读模式
实验一结果:
命令: (setq p0 '(1 1 1))
(1 1 1)
命令: (setq p1 '(2 4 6))
(2 4 6)
命令: (setq p2 '(3 7 11))
(3 7 11)
命令: (foreach p '(p1 p2) (setq p (mapcar '- (eval p) p0)))
(3 7 11)
实验二结果;
命令: (setq p0 '(1 1 1))
(1 1 1)
命令: (setq p1 '(2 4 6))
(2 4 6)
命令: (setq p2 '(3 7 11))
(3 7 11)
命令: (foreach p '(p1 p2) (setq p (mapcar '- p p0)))
; 错误: 参数类型错误: listp P1
红色部分为不相同的地方,在我的理解中,实验二应该为正统的方法(结果证明不对),因为p和p0两者是相同的,p1将值赋给p,p再和p0运算,这有什么不对嘛,为什么还要加(eval p),才正确呢?


本帖子中包含更多资源

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

x

点评

LZ,实验一的结果应该是(2 6 10)吧  发表于 2014-4-25 13:56
发表于 2012-12-15 23:47 | 显示全部楼层
注意 '(P1 P2) 中的' 等同于 quote函数。
而quote是返回表达式而不对其求值
意味着里面的 '(p1 p2)  = (list 'p1 'p2)
而不是(list p1 p2)
所以用 foreach的时候,P 代表的是表达式,为了得到正确的结果应该要(eval p)

点评

非常感谢,有种灌顶的感觉,明白了,耗了我不少脑细胞。看来还是要来这里多交流学习呀!  发表于 2012-12-15 23:51
发表于 2012-12-15 23:58 | 显示全部楼层

RE: 关于eval、mapcar和foraech的用法困惑?

'(p1 p2)表示表由P1和P2两个符号构成,改成(list p1 p2)就不需要加eval了。
发表于 2015-10-22 16:02 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 08:32 , Processed in 0.205890 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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