关于eval、mapcar和foraech的用法困惑?
实验一结果:命令: (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),才正确呢?
注意 '(P1 P2) 中的' 等同于 quote函数。
而quote是返回表达式而不对其求值
意味着里面的 '(p1 p2)= (list 'p1 'p2)
而不是(list p1 p2)
所以用 foreach的时候,P 代表的是表达式,为了得到正确的结果应该要(eval p)
RE: 关于eval、mapcar和foraech的用法困惑?
'(p1 p2)表示表由P1和P2两个符号构成,改成(list p1 p2)就不需要加eval了。
页:
[1]