删除列表中指定值中的一个值(若有多个重复值只删除第一个,区别于vl-remove的全部...
本帖最后由 guosheyang 于 2022-8-7 09:52 编辑给lisp的初学者们分享个自定义函数(高手请略过) ,删除列表中指定值中的一个值(若有多个重复值只删除第一个,区别于vl-remove的全部删除),若有问题请反馈,谢谢!
;函数功能:删除表中指定值中的一个(若有多个重复值只删除第一个,区别于vl-remove的全部删除)
;参数:L列表 del_item要删除的一个元素值
;返回值:删除一项指定值后的列表
;测试
(ygs_del_single
(setq L'(1 1 2 2 3 3 4 5 5 5 6 7 11 12 13 5 15 17 5 19 90 85 85 85 90 93 101))
(setq del_item 2)
)
;主程序
(defun ygs_del_single(L del_item / NL WZ)
(if(vl-position del_item L)
(progn
(setq wz(vl-position del_item L ))
(repeat wz
(setq nl(cons(car L )nl));新表
(setq L(cdr L))
)
(append(reverse nl)(cdr L))
)
(princ "\ndel_item不是所指定列表的成员")
)
)
代码二:简洁型
;(ygs_del_single L del_item)
(defun ygs_del_single(L del_item / NL)
(while(/=(car L) del_item)
(setq nl(cons (car L) nl))
(setq L(cdr L))
)
(append(reverse nl)(cdr L))
)
本帖最后由 表骑马实开车 于 2022-7-24 20:36 编辑
guosheyang 发表于 2022-7-24 19:53
嗯 改成while循环看起来简洁点也可以改为mapcar的循环
(setq Ls '(1 1 2 2 3 3 4 5 5 5 6 7 11 12 13 5 15 17 5 19 90 85 85 85 90
93 101)
)
(vv 1 ls)
(defun vv (k l)
(vl-remove nil
(mapcar '(lambda (x)
(if (= x k)
(setq x nil
k nil
)
x
)
)
l
)
)
)
这样吗 本帖最后由 表骑马实开车 于 2022-7-24 19:13 编辑
(defun vv (l k / b)
(if (vl-some '(lambda (x) (= x k)) l)
(progn
(while (not (= (car l) k))
(setq b (cons (car l) b)
l (cdr l)
)
)
(append (reverse b) (cdr l))
)
(princ "\ndel_item不是所指定列表的成员")
)
)
表骑马实开车 发表于 2022-7-24 18:55
(defun vv (l k / b)
(if (vl-some '(lambda (x) (= x k)) l)
(progn
嗯 改成while循环看起来简洁点也可以改为mapcar的循环 表骑马实开车 发表于 2022-7-24 20:31
(setq Ls '(1 1 2 2 3 3 4 5 5 5 6 7 11 12 13 5 15 17 5 19 90 85 85 85 90
93 101)
)
厉害{:1_1:}
页:
[1]