guosheyang 发表于 2022-7-23 09:48:00

删除列表中指定值中的一个值(若有多个重复值只删除第一个,区别于vl-remove的全部...

给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不是所指定列表的成员")
)
)

表骑马实开车 发表于 2022-7-24 18:55:00


(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不是所指定列表的成员")
)
)

guosheyang 发表于 2022-7-24 19:53:00


嗯   改成while循环看起来简洁点也可以改为mapcar的循环

表骑马实开车 发表于 2022-7-24 20:31:00


(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
             )
)
)
这样吗
页: [1]
查看完整版本: 删除列表中指定值中的一个值(若有多个重复值只删除第一个,区别于vl-remove的全部...