明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1475|回复: 7

[LISP]这个功能怎么样实现?

[复制链接]
发表于 2004-8-23 16:23:00 | 显示全部楼层 |阅读模式
怎么样删除表中指定位置的元素?比如(setq aa (list 2 2 3 5 6 9 9 5 4 2)),我要删除表中的第6个元素,得到的结果是(2 2 3 5 6 9 5 4 2).

发表于 2004-8-23 16:37:00 | 显示全部楼层
指令: (setq aa (list 2 2 3 5 6 9 9 5 4 2))
(2 2 3 5 6 9 9 5 4 2) 指令: (vl-remove (nth 5 aa) aa)
(2 2 3 5 6 5 4 2) 不好意思,少了一个9
 楼主| 发表于 2004-8-23 16:39:00 | 显示全部楼层
可是您将第七个元素也删除了。跟我要的结果不一样呀!(2 2 3 5 6 9 5 4 2).
发表于 2004-8-23 16:48:00 | 显示全部楼层
用下面的纯LISP函数代替2楼的VL-REMOVE函数。 (DEFUN XL-REMOVE (N L / TEMPL)
(SETQ TEMPL (LIST))
(REPEAT (1- N) (SETQ TEMPL (CONS (CAR L) TEMPL) L (CDR L)))
(SETQ L (CDR L) L (APPEND (LIST (REVERSE TEMPL)) L))
)
 楼主| 发表于 2004-8-23 17:35:00 | 显示全部楼层
有点不对,要做改动如下: (DEFUN XL-REMOVE (N L / TEMPL)
(REPEAT (1- N) (SETQ TEMPL (append (list (CAR L)) TEMPL) L (CDR L) ) )
(SETQ L (CDR L) L (APPEND (REVERSE TEMPL) L))
)
谢谢!
发表于 2004-8-24 09:26:00 | 显示全部楼层
感谢5楼的指正!昨天随手写了一个没有进行调试就发出了。现将调试后的代码贴上。 (DEFUN XL-REMOVE (N L / TEMPL)
(SETQ TEMPL (LIST))
(REPEAT (1- N) (SETQ TEMPL (CONS (CAR L) TEMPL) L (CDR L)))
(APPEND (REVERSE TEMPL) (CDR L))
)
 楼主| 发表于 2004-8-24 13:10:00 | 显示全部楼层
谢谢
发表于 2004-8-25 00:02:00 | 显示全部楼层
  1. (setq lst (list 2 2 3 5 6 9 9 5 4 2))
  2. (defun remnlst (n lst / i)
  3.    (apply 'append (mapcar '(lambda(x)(if (= n (setq i(if i (1+ i) 0))) nil (list x))) lst))
  4. )(remnlst 6 lst)
  5. _$
  6. (2 2 3 5 6 9 5 4 2)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-18 19:42 , Processed in 0.181851 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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