乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 83|回复: 5

关于Mapcar的使用?

[复制链接]
wzh

32

主题

104

帖子

8

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
232
发表于 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
         )
)
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 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
         )
)
回复

使用道具 举报

37

主题

297

帖子

15

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
449
发表于 2004-5-31 21:38:00 | 显示全部楼层
不能。这个函数引用的是表的值而不是表的指针。
回复

使用道具 举报

wzh

32

主题

104

帖子

8

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
232
发表于 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
回复

使用道具 举报

37

主题

297

帖子

15

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
449
发表于 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 ((("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.    )
回复

使用道具 举报

wzh

32

主题

104

帖子

8

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
232
发表于 2004-5-31 22:34:00 | 显示全部楼层
[URL=http://wpa.qq.com/msgrd?V=1&Uin=52481028&Site
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-8-17 19:37 , Processed in 3.417514 second(s), 64 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表