明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 869|回复: 11

[提问] 如果实现这样的一个功能

[复制链接]
发表于 2019-11-12 11:07:42 | 显示全部楼层 |阅读模式
(setq a (list '(1 . "AP-100-1") '(2 . "AP-100-2") '(3 . "AP-100-3") '(4 . "AP-100-4")) )(setq b "AP-100-4")


我想将变量B 从变量 A 中取出来,但取出来的内容(4 . "AP-100-4") 我只要前面的数字 4,请教前辈们这个怎样实现?

发表于 2019-11-12 14:25:19 | 显示全部楼层
ASSOC函数只能获取一组点对组成的列表中每个点对的第一个元素.
例如
(assoc 1 (list (cons 1 "2")))
返回的是(1 "2")
(assoc "2" (list (cons 1 "2")))
返回nil.
难点在于如何获得对应的点对.我想到的办法是用循环.
(setq a (list '(1 . "AP-100-1") '(2 . "AP-100-2") '(3 . "AP-100-3") '(4 . "AP-100-4")) )
(setq b "AP-100-4")

(foreach x a
        (if (equal (cdr x) b)
                (progn
                (princ (car x))
                (princ))
        )
)

有个需要注意的地方,cdr的返回值对于点对(1 . 2)和列表(1 2)是不一样的.(car对于两者是相同的)
(cdr (cons 1 2)->2
(cdr (list 1 2) ->(2)
还有个函数cadr,用法如下:
(cadr (list 1 2) ->2
但是遗憾的是(cadr (cons 1 2)会提示错误,输入的列表有缺陷.

所以建议你如果没有必要,尽量不要使用点对的方式代替列表.两者不注意区分,很容易出现程序错误.


点评

很给力,终于学会用这个函数了!  发表于 2019-11-14 13:57
回复 支持 1 反对 0

使用道具 举报

发表于 2019-11-12 11:33:16 | 显示全部楼层
命令: !lst
(4 . "AP-100-4")
命令: (car lst)
4
 楼主| 发表于 2019-11-12 12:09:20 | 显示全部楼层
fan_zh 发表于 2019-11-12 11:33
命令: !lst
(4 . "AP-100-4")
命令: (car lst)

可能是我表达的不清楚,我的意思是先从列表中查找出 (4 . "AP-100-4") 再取数字,就像(member a b)一样,但因为a=str,b=list,所以用member不能直接查找。我想要的是像member 直接从列表中查找出对应的内容
发表于 2019-11-12 13:03:54 | 显示全部楼层
Try ASSOC 函数
发表于 2019-11-12 14:06:59 | 显示全部楼层
(setq a '((1 . "AP-100-1") (2 . "AP-100-2") (3 . "AP-100-3") (4 . "AP-100-4")))
(setq b '(4 . "AP-100-4"))

(caar (vl-remove-if '(lambda(x)(/= (cdr x) (cdr b))) a))
 楼主| 发表于 2019-11-12 14:19:10 | 显示全部楼层
satan421 发表于 2019-11-12 14:06
(setq a '((1 . "AP-100-1") (2 . "AP-100-2") (3 . "AP-100-3") (4 . "AP-100-4")))
(setq b '(4 . "AP-1 ...

谢谢!就是要这个结果!
 楼主| 发表于 2019-11-12 19:17:22 | 显示全部楼层
wyl219 发表于 2019-11-12 14:25
ASSOC函数只能获取一组点对组成的列表中每个点对的第一个元素.
例如
(assoc 1 (list (cons 1 "2")))

学习了!!
 楼主| 发表于 2019-11-12 19:17:56 | 显示全部楼层
wyl219 发表于 2019-11-12 14:25
ASSOC函数只能获取一组点对组成的列表中每个点对的第一个元素.
例如
(assoc 1 (list (cons 1 "2")))

学习了!!
发表于 2019-11-13 08:49:08 | 显示全部楼层
递归
  1. (defun f (l a)
  2.   (cond
  3.     ((not l) nil)
  4.     ((= a (cdar l))
  5.      (caar l)
  6.     )
  7.     (t (f (cdr l) a))
  8.   )
  9. )

(setq a (list '(1 . "AP-100-1") '(2 . "AP-100-2") '(3 . "AP-100-3") '(4 . "AP-100-4")) )(setq b "AP-100-4")
(f a b)
4

点评

NB,一样的结果,会有多样的过程!!  发表于 2019-11-14 08:51
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-18 13:06 , Processed in 0.173966 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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