[LISP函数-表]:表中指定位置插入新元素或删除指定位置元素
;; ! ****************************************************************************
;; !xd-Insitem 作者: eachy [www.xdcad.net]
;; ! ****************************************************************************
;; ! 功能 : 表中指定位置插入新元素或删除指定位置元素
;; ! 参数 :
;; ! 'l' -表
;; ! 'item' -索引值或索引值表
;; ! 'element' -插入的元素或对应索引值表数量的插入元素表,nil 时为删除
;; ! 指定位置元素
;; ! 返回值 : 成功返回新表,否则返回原表
;; !
;; ! 注意 : 1 插入/删除位置为相对原表的位置,从 0 计数
;; !
;; ! e-mail : eachy@21cn.com
;; !
;; ! Web : www.xdcad.net
;; ! ****************************************************************************
;; eq .
;; _$ (ea:insitem '(1 2 3 4 5 6) 2 0)
;;(1 2 3 0 4 5 6)
;;_$ (ea:insitem '(1 2 3 4 5 6) '(1 4)'(0))
;;(1 2 0 3 4 5 nil 6)
;;_$ (ea:insitem '(1 2 3 4 5 6) '(1 4)'(0 0))
;;(1 2 0 3 4 5 0 6)
;;_$ (ea:insitem '(1 2 3 4 5 6) '(1 4)nil)
;;(1 3 4 6)
;;_$ (ea:insitem '(1 2 3 4 5 6) 4nil)
;;(1 2 3 4 6)
(defun xd-Insitem (l item element / n ll i pos l1)
(setq n 0 l1 l)
(if (= (type item) 'INT)
(setq item (list item))
)
(if (and element
(/= (type element) 'LIST)
)
(setq element (list element))
)
(if element
(while l
(setq i (car l))
(if ll
(if (setq pos (vl-position n item))
(setq ll (append (list (nth pos element) i) ll))
(setq ll (cons i ll))
)
(setq ll (cons i ll))
)
(setq n (1+ n)
l (cdr l)
)
)
(while l
(setq i (car l))
(if (not (vl-position n item))
(setq ll (cons i ll))
)
(setq n (1+ n)
l (cdr l)
)
)
)
(if ll
(reverse ll)
l1
)
) 表中指定位置插入新元素或删除指定位置元素
;; _$ (ea:insitem '(1 2 3 4 5 6) 2 0)
;;(1 2 3 0 4 5 6)
位数有误,应为(1 2 0 3 4 5 6)
或表述为,“指定位置之后插入新元素或删除指定位置元素”
;| (xl-subi lst ilst nlst)---------作者: 狂刀 [www.xdcad.net]
功能 : 表中指定位置插入新元素或删除指定位置元素
参数 : lst = 表 ;
ilst = 索引值或索引值表;
nlst = 插入的元素或对应索引值表数量的插入元素表,nil 时为删除;
返回值 : 成功返回新表,否则返回原表;
注意 : 1 插入/删除位置为相对原表的位置,从 0 计数;
实 例 :
(xl-subi '(1 2 3 4 5 6) '(1 4) '(0 0) ) ;;->(1 0 2 3 4 0 5 6)
(xl-subi '(1 2 3 4 5 6) '(1 4) '(0 nil)) ;;->(1 0 2 3 4 6)
(xl-subi '(1 2 3 4 5 6) '(1 4) '(0 )) ;;->(1 0 2 3 4 6)
(xl-subi '(1 2 3 4 5 6) '(1 4) nil);;->(1 3 4 6)
(xl-subi '(1 2 3 4 5 6)2 0);;->(1 2 0 3 4 5 6)
(xl-subi '(1 2 3 4 5 6) 2 nil);;->(1 2 4 5 6)
|;
(defun xl-subi (lst ilst nlst / i a) ;; by 狂刀.2005.8
(if (/= 'LIST (type ilst))(setq ilst (list ilst)))
(if (/= 'LIST (type nlst))(setq nlst (list nlst)))
(apply 'append (mapcar '(lambda(x)
(setq i (if i (1+ i) 0))
(if (= (car ilst) i)
(progn
(setq ilst (cdr ilst)
a (car nlst)
nlst (cdr nlst))
(if a (list a x)nil)
)
(list x)
)
)
lst)
)
) 两位的都很精彩,不要一味在概念理解偏差上纠缠! 先收了再消化! 感谢eachy 及 狂刀 分享函数! 感谢两位大侠提供精彩函数,呵呵,不过一时半刻还真消化不了呀 本帖最后由 wowan1314 于 2013-7-20 14:12 编辑
我也来凑热闹!;============{ 在指定位置删除或插入元素 }===============
;nil表示要删除。如果有值为要插入的元素---by wowan1314
;(t11 '(1 2 3 4 5 6) 2 0);;->(1 2 0 3 4 5 6)
;(t11 '(1 2 3 4 5 6) 2 nil);;->(1 2 4 5 6)
;2013年7月20日 星期六
(defun t11 (lst pos mod / qlst a hlst)
(setq a -1)
(setq hlst (vl-member-if-not
'(lambda(x)
(setq a (1+ a))
(if (= a pos) nil
(setq qlst (cons x qlst))
)
)
lst
)
)
(if mod
(apply 'append (list (reverse(cons mod qlst)) hlst))
(apply 'append (list (reverse qlst) (cdr hlst)))
)
) 来看看,收藏了~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~····· 谢谢老师的分享 来看看,收藏了;P 本帖最后由 小菜 于 2021-3-31 12:58 编辑
楼主的函数确实有误,如:(ea:insitem '(1 2 3 4 5 6) 0 0)
狂刀的也有问题 (xl-subi '(1 2 3 4 5 6)6 0)
小菜 发表于 2021-3-31 11:20
楼主的函数确实有误,如:(ea:insitem '(1 2 3 4 5 6) 0 0)
狂刀的也有问题 (xl-subi '(1 2 3 4 5 6)6 0 ...
确实有bug,可惜Eachy和狂刀潜水太深,都快成为传说中的大神了。
这个板块也是冷清清的。 谢谢分享谢谢分享
页:
[1]