注册 登录
明经CAD社区 返回首页

snddd2000的个人空间 http://www.mjtd.com/?393651 [收藏] [复制] [分享] [RSS]

日志

[函数]AutoCAD Lisp获取表中的前n个元素和其后的元素,并切分表。

热度 1已有 1750 次阅读2012-12-27 17:13 |系统分类:开发| Autolisp

(defun sn:leftnthlst (n lst)
;;;返回一个表中的前n个元素的表
;;;示例:(sn:leftnthlst 2 '(1 2 3 4 5 6));返回表(1 2)
;;;如果输入的n值大于表长返回原表;小于1返回nil
(vl-remove nil
(mapcar '(lambda (x)
(if (>= (setq n (1- n)) 0)
x
nil
)
)
lst
)
)
)
(defun sn:rightnthlst (n lst)
;;;返回一个表中的第n个元素开始的表
;;;示例:(sn:rightnthlst 2 '(1 2 3 4 5 6));返回表(2 3 4 5 6)
;;;如果输入的n值大于表长返回原表;小于1返回nil
(vl-remove nil
(mapcar '(lambda (x)
(if (> (setq n (1- n)) 0)
nil
x
)
)
lst
)
)
)

;;;有了上面两个函数可以完成把一个表分成定长度的若干分表
(defun sn:splitlst (len lst / newlst)
;;;切分表lst成若干段长度为len的子表,子表的个数=(fix (/ (length lst) len))
;;;示例:(sn:splitlst 2 '(1 2 3 4 5 6));返回((1 2)(3 4)(5 6))
(while lst
(setq newlst (cons (sn:leftnthlst len lst) newlst))
(setq lst (cdr (sn:rightnthlst len lst)))
)
(reverse newlst)
)

;;;定义一个删除指定位置的表内某项,0为第一项
(defun sn:nthremove (n lst / newlst)

;;;示例:(sn:nthremove 2 '(1 2 3 4 5 6));返回(1 2 4 5 6)
(if (= 0 n)
(cdr lst)
(append (sn:leftnthlst n lst) (sn:rightnthlst (+ 2 n) lst))
)
)


路过

雷人

握手

鲜花

鸡蛋

发表评论 评论 (2 个评论)

回复 crazylsp 2012-12-31 19:03
赞叹好强的递归。
回复 snddd2000 2013-1-1 21:11
谢谢

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

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

GMT+8, 2024-4-29 16:46 , Processed in 0.117992 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部