gpt4 book ai didi

Lisp 通过列表列表使用成员

转载 作者:太空宇宙 更新时间:2023-11-03 19:01:33 26 4
gpt4 key购买 nike

在普通的 lisp 中,我有一棵符号树,例如:

(setf a '((shoe (walks(town)) (has-laces(snow)))
(tree (grows(bob)) (is-green(house)) (is tall(work)))))

都是符号。

我想返回包含我搜索的符号的子列表(在这种情况下,我可能会使用符号 shoe 进行搜索并返回包含它们的整个子列表。关键字总是在第二层永远不会更深

尝试使用:

(mapcar #'member (shoe my-list))

但要求 shoe 是一个列表(因为 mapcar?)之后事情变得非常复杂。请帮忙!

最佳答案

给定:

(setf a '((shoe (walks(town)) (has-laces(snow)))
(tree (grows(bob)) (is-green(house)) (is tall(work)))))

我们可以这样找到第一个 (shoe ...) 子列表:

(find 'shoe a :key #'car)

-> (SHOE (WALKS (TOWN)) (HAS-LACES (SNOW)))

即搜索对象列表,即列表,并使用他们的 car 作为搜索关键字。

如果可以有重复项并且我们想要一个包含所有以 shoe 开头的子列表的列表,那么 Common Lisp 的标准库就显得有点笨拙了。没有一个很好的函数可以找到一个项目的所有出现;我们使用 lambda 求助于 remove-if-not:

(remove-if-not (lambda (x) (eq x 'shoe)) a :key #'car)

我们也可以写一个循环表达式:

(loop for (sym . rest) in a and
for whole in a
if (eq sym 'shoe) collect whole)

我们也可以让自己成为一个快速而肮脏的find-all,它可以像all一样被调用:

(defun find-all (item sequence &key (key #'identity) (test #'eql))
(remove-if-not (lambda (elem) (funcall test item elem)) sequence :key key))

然后:

(find-all 'shoe a :key #'car)

--> ((SHOE (WALKS (TOWN)) (HAS-LACES (SNOW))))

(find-all 'x '((x 1) (y 2) (x 3) (z 4)) :key #'car)

--> ((X 1) (X 3))

(find 'x '((x 1) (y 2) (x 3) (z 4)) :key #'car)

--> ((X 1))

关于Lisp 通过列表列表使用成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48212618/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com