明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3091|回复: 11

关于Mapcar的使用?

  [复制链接]
发表于 2004-5-31 20:35:00 | 显示全部楼层 |阅读模式
我在使用mapcar时遇到这样的问题,就是在mapcar中间修改表的内容后,比如x取表的第1个数("1"),执行完某些功能后,将表的第1、 2个数("1" 、"2")删除,结果x在第2次取数时仍然按旧表中的内容取原有的第2个数("2"已被删除),而不是取新表的第一个数("3"旧表的第3个数),为什么?能让它在第2次取数时取"3"吗? (defun c:aa()
(setq Slist (list "1" "2" "3" "4" "5" "6" "7" "8" "9" "0"))
(mapcar '(lambda (X)
(setq a (1+ 2))
(setq Slist (cdr (cdr Slist)))
)
Slist
)
)
发表于 2004-5-31 21:38:00 | 显示全部楼层
看不明白你想做什么。。。你的程序就更看不明白了,好象什么都不做 看看下面改的,其实已经是你说的读“3”了,只不过mapcar函数一开始就读取了Slist整个表,以后就不读了,所以后面的执行跟Slist无关 就想repeat函数,假如n是5,你使用(repeat n ...即使过程中将n变为了别的数字,这个循环还是循环5次, 你还是说说你要做什么,肯定有办法解决的,要你去适应语言,而不能让语言来适应你 (defun c:aa()
(setq Slist (list "1" "2" "3" "4" "5" "6" "7" "8" "9" "0"))
(mapcar '(lambda (X)
(setq a (1+ 2))
(setq Slist (cdr (cdr Slist)))
(Princ "\n")
(princ (car Slist))
)
Slist
)
)
发表于 2004-5-31 21:38:00 | 显示全部楼层
不能。这个函数引用的是表的值而不是表的指针。
 楼主| 发表于 2004-5-31 22:09:00 | 显示全部楼层
我只是把问题简化了,实际上我要完成的是: Slist是一个嵌套表'(("AAA" "BBB" ) ("CCC" "DDD") ("ABC" "BBB") ("CDF" "BBB")......),我需要将第2个参数相同的表合并,得到如下结果: '(("AAA,ABC,CDF" "BBB") ("CCC" "DDD")) 其实在我的程序中,mapcar中还嵌套了一个mapcar,不好意思,没把问题讲清。 原程序是这样的: (mapcar '(lambda (X);将相同名称和型式的参数合并
(setq L02 (nth 1 X))
(setq NameLst (cdr NameLst))
(mapcar '(lambda (Y)
(if (member L02 Y)
(progn
(setq L01 (strcat (nth 0 X) "," (nth 0 Y)))
(setq X (subst L01 (nth 0 X) X))
(setq NameLst (vl-remove Y NameLst))
);progn
);if
);lambda1
NameLst
);mapcar1
(setq TmpList (append TmpList (list X)))
);lambda2
NameLst
);mapcar2
发表于 2004-5-31 22:15:00 | 显示全部楼层
先不说楼主的函数是否有意义。我来就事论事。想要改变值的引用方式,AutoLISP中没有直接的办法,只能使用引用符号的方式来模拟指针类的引用。因此,达到你要求的效果,需要自己改写Mapcar函数。首先举个改变参数值的例子,比如,类似于C语言中的i++, ++i, 你可以通过对符号的引用改变符号的值:
  1. (defun ++ (x)
  2.    (set x (1+ (eval x)))
  3. );;; test ++(setq a 3)
  4. (++ 'a)
  5. (++ 'a)
  6. (princ a)
符合你要求的Mapcar函数只能自己改写:
  1. (defun mapcar2 (func lstsym / lst rt i)
  2.    (setq i 0)
  3.    (while (< i (length (setq lst (eval lstsym))))
  4.        (setq rt (cons (apply func (list (nth i lst))) rt))
  5.        (setq i (1+ i))
  6.    )
  7.    (reverse rt)
  8. )(defun c:test ()
  9.    (setq testlist '(1 2 3 4 5 6))
  10.    (mapcar2 '(lambda (x)
  11.              (setq testlist '(1 2 3))
  12.              (1+ x)
  13.          )
  14.        'testlist ;注意:此处的单引号指定对testlist符号的引用
  15.    )
  16. )
 楼主| 发表于 2004-5-31 22:34:00 | 显示全部楼层
函数是有意义的,这是对相同特性的设备的统计,在设备表中对于相同特性的设备应合并到一个表格中。


我再按您说的办法试试,谢谢。
发表于 2004-5-31 22:57:00 | 显示全部楼层
wzh发表于2004-5-31 22:34:00函数是有意义的,这是对相同特性的设备的统计,在设备表中对于相同特性的设备应合并到一个表格中。 我再按您说的办法试试,谢谢。

我的意思是,这种要求也许并不适合采用mapcar函数。
发表于 2004-12-28 23:08:00 | 显示全部楼层
(defun c:test( / ss i i1 i2 ent_lst)
(setq ss (ssget '((0 . "*TEXT"))));选择text的所有文档
(setq i 0)
(repeat (sslength ss)
(setq ent_lst (append ent_lst (list (ssname ss i)))
i (1+ i))
)


(setq ent_lst (vl-sort ent_lst '(lambda(e1 e2) (< (caddr (assoc 10 (entget e1)))
(caddr (assoc 10 (entget e2)))))));按Y坐标排序
(setq ent_lst (vl-sort ent_lst '(lambda(e1 e2) (< (cadr (assoc 10 (entget e1)))
(cadr (assoc 10 (entget e2)))))));按X坐标排序
(setq i1 (cadr (assoc 10 (entget e1))))
(setq i2 (cadr (assoc 10 (entget e2))))
(cond (/= i1 i2)
(princ "\t"))
(cond (= i1 i2)
(princ "\n"))
(mapcar '(lambda(e)
(princ (cdr (assoc 1 (entget e))))) ent_lst);将坐标打印到命令行
(princ)
)
请各位老大帮我改改可以吗???
发表于 2004-12-30 01:50:00 | 显示全部楼层
  1. ;;;
  2. (setq lst '(("AAA" "BBB" ) ("CCC" "DDD") ("ABC" "BBB") ("CDF" "BBB")))
  3. (test lst) ->(("AAA,ABC,CDF" "BBB") ("CCC" "DDD"))
  4. ;;;
  5. (defun test (lst / nlst)
  6.    (mapcar '(lambda(x)(setq xx (cadr x))
  7.            (if (not(apply 'or (mapcar '(lambda(y)(setq yy (cadr y))
  8.       (if (and xx yy (= xx yy))
  9.          (setq nlst (subst (list (strcat (car y) "," (car x)) yy) y nlst))
  10.          nil
  11.          )
  12.       )
  13.              nlst)))
  14.                (setq nlst (cons x nlst))
  15.                )
  16.        ) lst)
  17.    (reverse nlst)
  18.    )
发表于 2005-7-15 13:20:00 | 显示全部楼层
[URL=http://wpa.qq.com/msgrd?V=1&amp;Uin=52481028&amp;Site
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-17 17:51 , Processed in 0.191764 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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