明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 605|回复: 8

[提问] 这段代码该怎么修改呢?糊涂了

[复制链接]
发表于 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中子表的第一个元素,如果要适配子表中的每一个元素,应该怎么修改代码?子表的长度不等,元素不一定是同一类型的:可能有字符串,也可能有数字等。

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 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 | 显示全部楼层
  1. (defun findkey (_keyword _lst /)
  2.    (vl-remove-if-not '(lambda(x)   
  3.      (vl-remove nil  (mapcar '(lambda(y) (and (= 'STR (type y)) (wcmatch (strcase _keyword) (strcase y)))) x))
  4.     )  _lst)  
  5. )


(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只返回第一个找到的值就终止了.
发表于 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,比如,这样

  1. (defun findkey (_keyword _lst /)
  2.    (vl-remove-if-not '(lambda(x)   
  3.      (vl-some '(lambda(y) (and (= 'STR (type y)) (wcmatch (strcase _keyword) (strcase y)))) x)
  4.     )  _lst)  
  5. )


发表于 2024-8-14 18:43:45 | 显示全部楼层
  1. (defun findkey(kw lst)(vl-remove-if-not'(lambda(x)(vl-string-search(strcase kw)(strcase(car x))))lst))
 楼主| 发表于 2024-8-14 20:20:00 | 显示全部楼层
经过测试,5楼的代码可能是最切近我的需求的。
6楼的代码在处理数字元素时会有问题。
黄翔朋友的代码处理的更全面,但我只需要找到第一个匹配就退出,效果会更高
 楼主| 发表于 2024-8-23 01:39:45 | 显示全部楼层
tryhi 发表于 2024-8-14 15:40
(defun findkey (keyword lst /)  
(vl-some
'(lambda(x)

这段程序如果扩展为 lst 中的元素不仅仅是子表,如果是任意字符串、数字等元素呢,该怎么处理呢?比如keyword 与表中的某个字符串匹配则返回字符串,与子表中的元素匹配返回子表。
发表于 2024-8-23 09:45:51 | 显示全部楼层
本帖最后由 tryhi 于 2024-8-23 10:04 编辑
wharan 发表于 2024-8-23 01:39
这段程序如果扩展为 lst 中的元素不仅仅是子表,如果是任意字符串、数字等元素呢,该怎么处理呢?比如key ...

看不懂啥意思,但是你的程序为什么要设计出这么复杂的表,表的结构应该清晰明了规则清楚
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 08:32 , Processed in 0.222376 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表