热度 1||
(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))
)
)