用foreach已实现的功能,如何用vl-remove-if 、vl-some等方式实现?
本帖最后由 wharan 于 2024-8-18 18:39 编辑这段程式,New_List、 Atts 、KeyWordTmp均为表,New_List、 Atts表元素为二维子表,KeyWordTmp元素为模糊查询的关键词。将New_List、 Atts的元素与KeyWordTmp中的关键词模糊匹配。如果New_List、 Atts均在KeyWordTmp中匹配到相同的关键词,则用New_List、 Atts认为匹配并用它们的相关值组成新表。该功能在下面程式已完成匹配,但效率较低。
;;属性标志模糊转换函数,返回转换后的表
(defun Tag2tag (New_List Atts KeyWordTmp / _Tmp _Tmpy _Tmpz)
(setq _Tmp nil)
(foreach y New_List
(setq _Tmpy (findkey (car y) KeyWordTmp))
(foreach z Atts
(setq _Tmpz (findkey (car z) KeyWordTmp))
(if (= _Tmpy _Tmpz)
(setq _Tmp (cons (cons (car z) (cdr y)) _Tmp))
)
)
)
_Tmp
)
这个问题,有了一些进步,也确实看到了效率的提升。附件是进行了一些改进的测试程序,上次漏发了一个函数。
受tryhi、黄翔等大侠启发,感觉vl-remove-if 、vl-some等方式实现该功能效率应该会更高。无奈没仔细研究过这几个表函数,屡试无果,特来求教。
感觉是个好案例,有测试数据吗? jenlin 发表于 2024-8-15 21:01
感觉是个好案例,有测试数据吗?
今天论坛不正常,附件上传很困难。另外一个帖子有测试程序。 jenlin 发表于 2024-8-15 21:01
感觉是个好案例,有测试数据吗?
已上传测试程序 (defun findkey(k lst)
(car
(vl-remove-if-not
'(lambda(x)
(wcmatch(strcase k)(strcase(strcat(car x)","(cadr x))))
)
lst
)
)
)
(defun Tag2tag(New_List Atts KeyWordTmp)
(mapcar
'(lambda(a b)
(if(eq(findkey(car a)KeyWordTmp)(findkey b KeyWordTmp))
(cons b(cdr a))
)
)
New_List
(mapcar 'car Atts)
)
)
页:
[1]