【问题标题】:Something like find in lisp像在 lisp 中找到的东西
【发布时间】:2012-11-01 05:24:17
【问题描述】:

在 lisp 中是否有类似 find 的函数返回 true 而不是我们要查找的元素?

示例:

我希望它这样做

(find 'x '(a c x)) = t

不是

(find 'x '(a c x)) = x

另外,我问的原因是因为我试图到达列表中最深的元素。我的计划是每次递归调用它时都将列表展平。

然后我会停止递归调用

(mapcar 'atom list)

会告诉我那里的每个原子都是真实的。

你认为这是解决这个问题的好方法吗?

【问题讨论】:

  • 为什么?在 lisp 中,除了 nil 之外的任何内容都是正确的。但是,双重否定会做你想做的事:即 (not (null (find ...)))

标签: lisp flatten


【解决方案1】:

没有这样的函数,但写一个再简单不过了:

(defun find-t (&rest args)
  (when (apply #'find args)
    t))

您也可以使用(every #`(eql t %) list) 代替(mapcar 'atom list),即检查list 中的每个项目是否完全是t。 (这里#`() 是我使用的单参数lambdas 的语法糖。)

但总体而言,尚不清楚您要通过所有这些实现什么。你能详细说明你想做什么吗?

【讨论】:

  • 正如我在描述中所说的那样。我正在尝试在列表中找到最深的原子。所以我正在做的是逐级展平列表。例如:我想要(flatten '(a (b (d (g f))) e)) = (a b (d (g f )) e ),因此我将使用 find 检查列表中是否还有任何列表。当没有时,我将返回最深处的元素。但是,现在我无法找出如何逐级展平它 =P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
相关资源
最近更新 更多