SWAYWOOD 发表于 2004-5-13 20:09:00

我的程序还很乱,贴上来只怕耽误你的时间,不如你把你的测试程序贴上来看看,或许对我有启发,谢谢……

无痕 发表于 2004-5-13 23:21:00

好像不是很复杂的程序嘛,应该不会用很多时间来看的

无痕 发表于 2004-5-16 01:37:00

转贴一个别的网站的题目:


(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>

SWAYWOOD 发表于 2004-5-16 09:46:00

比较难啊

meflying 发表于 2004-5-16 09:49:00

如果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>)

SWAYWOOD 发表于 2004-5-16 10:09:00

我也发现mapcar可以搞定,不过下面的不知道,又学了一招,谢谢

SWAYWOOD 发表于 2004-5-16 10:56:00

(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>_$

meflying 发表于 2004-5-16 11:07:00

楼上的, 似乎做复杂了吧,,,是那种把简单的事情可以变复杂了来做


这样就可以了:


(defun pnadd(n b)<BR>       (+ (eval (read (strcat "p" (itoa n)))) b)<BR>)

SWAYWOOD 发表于 2004-5-16 20:06:00

你的程序,运行结果:


_$ (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>_$

meflying 发表于 2004-5-17 08:55:00

既然是函数, 就尽量不要去改变主函数的变量,这样程序的可读性就降低了很多,


你可以使用其返回值,如:


(setq p10 (pnadd 10 1.5));
页: 1 [2] 3
查看完整版本: 求助,关于变量赋值的问题