77077 发表于 2014-12-1 14:56:43

求个函数:以关键词 替换\添加\删除点对表中的元素

;以关键词 替换\添加\删除点对表中的元素

替换BC
;(uplstBYindex '(("A" . 1) ("B" . 2) ("C" . 3) ("D" . 4)) '(("B" . 10)("C" . 11)))
;=>'(("A" . 1) ("B" . 10) ("C" . 11) ("D" . 4))

添加EF
;(uplstBYindex '(("A" . 1) ("B" . 2) ("C" . 3) ("D" . 4)) '(("E" . 10) ("F" . 11)))
;=>'(("A" . 1) ("B" . 10) ("C" . 11) ("D" . 4) ("E" . 10) ("F" . 11))

删除AC
;(uplstBYindex '(("A" . 1) ("B" . 2) ("C" . 3) ("D" . 4)) '(("A" . NIL) ("C" . NIL)))
;=>'(("B" . 10) ("D" . 4))


(if (在旧表中能找到关键词)
(if (= (cdr 新元素) nil)
    (删除模式)
    (更新模式)
)
(添加模式)
)

不知道我的表述清楚没有!

77077 发表于 2014-12-1 17:49:56

本帖最后由 77077 于 2014-12-1 17:51 编辑

半成品
;(tt '(("A" . 1) ("B" . 2) ("C" . 3) ("D" . 4)) '("B" . 10))
;=>'(("A" . 1) ("B" . 10) ("C" . 11) ("D" . 4))
;删除AC
;(tt '(("A" . 1) ("B" . 2) ("C" . 3) ("D" . 4)) '("C"))
;=>'(("B" . 10) ("D" . 4))
(defun tt (l1 a / ll lt)
(foreach n l1
    (if (= (car n) (car a))
      (if (cdr a)
         (setq lt (cons (car n) (cdr a))
               ll (cons lt ll)
         )
      )
   (setq ll (cons n ll))
    )
)
(reverse ll)
)

wowan3344 发表于 2014-12-1 19:04:50

这个函数对楼主来说,应该不难!

你自己先写出来, 如果有优化的空间,大家再帮你优化。

77077 发表于 2014-12-1 20:00:15

本帖最后由 77077 于 2014-12-1 20:04 编辑

就是写不出来哈,修改和删除都弄完了,我不知道怎么弄添加这个选项啊~~~
问题是,怎么判断oldl已经含有newl的项目呢?
(defun tt (oldl newl / tt1 b)
(defun tt1 (oldl a / ll lt)
(foreach n oldl
    (if (= (car n) (car a))
      (if (cdr a)
         (setq lt (cons (car n) (cdr a))
               ll (cons lt ll)
               )
      )
   (setq ll (cons n ll))
    )
)
(reverse ll)
)
(while newl
    (setq b (car newl)
             oldl (tt1 oldl b)
             newl (cdr newl)
             )
)
oldl
)
命令:(tt '(("A" . 1) ("B" . 2) ("C" . 3) ("D" . 4)) '(("B" . 10)("C" . 11)))
=》(("A" . 1) ("B" . 10) ("C" . 11) ("D" . 4))
命令: (tt '(("A" . 1) ("B" . 2) ("C" . 3) ("D" . 4)) '(("B" . 10)("C")))
=》(("A" . 1) ("B" . 10) ("D" . 4))

wowan3344 发表于 2014-12-1 23:54:43

等不及了!;(setq lst '(("A" . 1) ("B" . 2) ("C" . 3) ("D" . 4)) )
;删A改B加E
;(t11 lst '(("A" . nil)("B" . 0)("E" . 5)))
;;对组码型表进行 "删除" 、"替换" 、"增加" 的处理
(defun t11 (o n / c)
    (mapcar
      ''((a)
            (if (setq c (assoc (car a) o))
                (if (cdr a)
                  (setq o (subst a c o))
                  (setq o (vl-remove-if ''((b)(= (car a) (car b))) o))
                )
                (setq o (cons a o))
            )
      )
      n
    )
    o
)

77077 发表于 2014-12-2 01:13:43

wowan3344 发表于 2014-12-1 23:54 static/image/common/back.gif
等不及了!

看不懂你的,不过抄了点你的代码,弄了一个
(defun tt1 (oldl newl / a b n x)
(foreach n newl
    (if (setq a (assoc (car n) oldl))
      (if (cdr n)
          (setq oldl (subst n a oldl))
          (setq oldl (vl-remove-if '(lambda(x) (= (car a) (car x))) oldl))
      )
      (setq oldl (cons n oldl))
    )
)
oldl
)
;;对组码型表进行 "删除" 、"替换" 、"增加" 的处理
命令: (tt1 '(("A" . 1) ("B" . 2) ("C" . 3) ("D" . 4)) '(("A" . nil)("B" . 0)("E" . 5)))
(("E" . 5) ("B" . 0) ("C" . 3) ("D" . 4))

ivde 发表于 2014-12-2 05:49:45

assoc+subst
页: [1]
查看完整版本: 求个函数:以关键词 替换\添加\删除点对表中的元素