我的程序还很乱,贴上来只怕耽误你的时间,不如你把你的测试程序贴上来看看,或许对我有启发,谢谢……
好像不是很复杂的程序嘛,应该不会用很多时间来看的
转贴一个别的网站的题目:
(setq p1 1 p2 2 p3 3 p4 4 p5 5)
;让pn (n= 1~5)的值增加0.5
要求程序具有通用性,即n不定,可以为任意整数。
通用的表述是:
已经知道 pn(n>=0)的值,要求对pn的值分别加上一个数值b(b为任意实数)
<BR>
比较难啊
如果p1 p2 ... pn组成列表,mapcar搞定
否则:
(defun c:test( / i sym p1 p2 p3 p4 p5)<BR> (setq p1 1 p2 2 p3 3 p4 4 p5 5)<BR> (setq i 1)<BR> (while (eval (setq sym (read (strcat "p" (itoa i)))))<BR> (set sym (+ (eval sym) 0.5))<BR> (setq i (1+ i))<BR> )<BR> (list p1 p2 p3 p4 p5)<BR>)
我也发现mapcar可以搞定,不过下面的不知道,又学了一招,谢谢
(setq p10 999 p18 3 )
(defun pnadd(n b)<BR> (setq list1 (list (read (strcat "p" (itoa n)))))<BR> (car (mapcar 'set list1 (mapcar '(lambda (x) (+ x b)) (mapcar 'eval list1))))<BR> )
_$ (setq p10 999 p18 3 )<BR>3<BR>_$ (pnadd 10 2)<BR>1001<BR>_$ (pnadd 18 6)<BR>9<BR>_$
楼上的, 似乎做复杂了吧,,,是那种把简单的事情可以变复杂了来做
这样就可以了:
(defun pnadd(n b)<BR> (+ (eval (read (strcat "p" (itoa n)))) b)<BR>)
你的程序,运行结果:
_$ (setq p10 9)<BR>9<BR>_$ (pnadd 10 1.5)<BR>10.5<BR>_$ p10<BR>9<BR>_$
我的有一点不同,既运算,同时也改变变量值,
_$ (setq p10 9)<BR>9<BR>_$ (pnadd 10 1.5)<BR>10.5<BR>_$ p10<BR>10.5<BR>_$
既然是函数, 就尽量不要去改变主函数的变量,这样程序的可读性就降低了很多,
你可以使用其返回值,如:
(setq p10 (pnadd 10 1.5));