如果实现这样的一个功能
(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,请教前辈们这个怎样实现?
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)会提示错误,输入的列表有缺陷.
所以建议你如果没有必要,尽量不要使用点对的方式代替列表.两者不注意区分,很容易出现程序错误.
命令: !lst
(4 . "AP-100-4")
命令: (car lst)
4
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 直接从列表中查找出对应的内容 Try ASSOC 函数 (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)) 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 ...
谢谢!就是要这个结果! wyl219 发表于 2019-11-12 14:25
ASSOC函数只能获取一组点对组成的列表中每个点对的第一个元素.
例如
(assoc 1 (list (cons 1 "2")))
:victory:学习了!! wyl219 发表于 2019-11-12 14:25
ASSOC函数只能获取一组点对组成的列表中每个点对的第一个元素.
例如
(assoc 1 (list (cons 1 "2")))
学习了!! 递归
(defun f (l a)
(cond
((not l) nil)
((= a (cdar l))
(caar l)
)
(t (f (cdr l) a))
)
)
(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
页:
[1]