wharan 发表于 2024-8-14 14:55:47

这段代码该怎么修改呢?糊涂了

;;在表中模糊查找与关键字keyword相匹配的点对,不分大小写;;(findkey "A1" '(("A1*" 1 ) ("A2*" 2"A123") ("B1*" 3))) 返回("A1*" 1),否则返回nil(defun findkey (keyword lst /)(foreach x lst    (car      (vl-member-if        '(lambda (x) (wcmatch (strcase keyword) (strcase (car x))))        lst      )    )))
目前keyword仅能适配表lst中子表的第一个元素,如果要适配子表中的每一个元素,应该怎么修改代码?子表的长度不等,元素不一定是同一类型的:可能有字符串,也可能有数字等。

tryhi 发表于 2024-8-14 15:40:40

本帖最后由 tryhi 于 2024-8-14 15:43 编辑


(defun findkey (keyword lst /)
(vl-some
'(lambda(x)
(if(vl-some
'(lambda(y)
(if (= 'str (type y))(wcmatch (strcase keyword) (strcase y)))
)
x)x)
)
lst)
)

黄翔 发表于 2024-8-14 15:52:10

(defun findkey (_keyword _lst /)
   (vl-remove-if-not '(lambda(x)   
   (vl-remove nil(mapcar '(lambda(y) (and (= 'STR (type y)) (wcmatch (strcase _keyword) (strcase y)))) x))
    )_lst)
)

(findkey "A1" '(("A1*" 1 ) ("A2*" 2"A123") ("B1*" 3)))
-->(("A1*" 1))

(findkey "A1" '(("A1*" 1 ) ("A2*" 2"A1*") ("B1*" 3)))
-->(("A1*" 1) ("A2*" 2 "A1*"))

(findkey "A1" '(("A12*" 1 ) ("A2*" 2"A12*") ("B1*" 3)))
-->nil

黄翔 发表于 2024-8-14 16:00:53

tryhi 发表于 2024-8-14 15:40
(defun findkey (keyword lst /)
(vl-some
'(lambda(x)


第一个vl-some要改为vl-remove-if-not
否则findkey只返回第一个找到的值就终止了.

tryhi 发表于 2024-8-14 16:02:11

本帖最后由 tryhi 于 2024-8-14 16:31 编辑

黄翔 发表于 2024-8-14 16:00
第一个vl-some要改为vl-remove-if-not
否则findkey只返回第一个找到的值就终止了.
根据题主的题意,我认为应该终止,另外从性能优化上来讲,你的二级应该用vl-some,而不是mapcar,比如,这样

(defun findkey (_keyword _lst /)
   (vl-remove-if-not '(lambda(x)   
   (vl-some '(lambda(y) (and (= 'STR (type y)) (wcmatch (strcase _keyword) (strcase y)))) x)
    )_lst)
)

xyp1964 发表于 2024-8-14 18:43:45

(defun findkey(kw lst)(vl-remove-if-not'(lambda(x)(vl-string-search(strcase kw)(strcase(car x))))lst))

wharan 发表于 2024-8-14 20:20:00

经过测试,5楼的代码可能是最切近我的需求的。
6楼的代码在处理数字元素时会有问题。
黄翔朋友的代码处理的更全面,但我只需要找到第一个匹配就退出,效果会更高

wharan 发表于 2024-8-23 01:39:45

tryhi 发表于 2024-8-14 15:40
(defun findkey (keyword lst /)
(vl-some
'(lambda(x)


这段程序如果扩展为 lst 中的元素不仅仅是子表,如果是任意字符串、数字等元素呢,该怎么处理呢?比如keyword 与表中的某个字符串匹配则返回字符串,与子表中的元素匹配返回子表。

tryhi 发表于 2024-8-23 09:45:51

本帖最后由 tryhi 于 2024-8-23 10:04 编辑

wharan 发表于 2024-8-23 01:39
这段程序如果扩展为 lst 中的元素不仅仅是子表,如果是任意字符串、数字等元素呢,该怎么处理呢?比如key ...
看不懂啥意思,但是你的程序为什么要设计出这么复杂的表,表的结构应该清晰明了规则清楚
页: [1]
查看完整版本: 这段代码该怎么修改呢?糊涂了