wharan 发表于 2024-8-15 19:59:35

用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:57

感觉是个好案例,有测试数据吗?

wharan 发表于 2024-8-15 21:27:38

jenlin 发表于 2024-8-15 21:01
感觉是个好案例,有测试数据吗?

今天论坛不正常,附件上传很困难。另外一个帖子有测试程序。

wharan 发表于 2024-8-18 18:40:18

jenlin 发表于 2024-8-15 21:01
感觉是个好案例,有测试数据吗?

已上传测试程序

xtjd 发表于 2024-8-19 14:48:08

(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]
查看完整版本: 用foreach已实现的功能,如何用vl-remove-if 、vl-some等方式实现?