求个函数:以关键词 替换\添加\删除点对表中的元素
;以关键词 替换\添加\删除点对表中的元素替换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: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)
)
这个函数对楼主来说,应该不难!
你自己先写出来, 如果有优化的空间,大家再帮你优化。 本帖最后由 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))
等不及了!;(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
) 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)) assoc+subst
页:
[1]