lisp - 为什么这个程序返回一个原子列表?

标签 lisp common-lisp

所以我在学校学习 Lisp,我必须创建的程序之一是使用 mapcan 复制 remove-if-not 功能的程序。我已经创建了该程序并且它可以正常工作,但我不理解输出。

具体来说,如果我要运行:

(findall 'numberp '(1 a 3))

输出为:(1 3)

程序如下:

(defun findAll (fct l)
(cond
        ((null l) nil)
        ((mapcan (lambda(x) (if (funcall fct x) (list x) nil )) l))
    )
)

我对解决方案的理解如下: "对列表l中的每一个元素都调用lambda函数,如果函数的结果适合且元素x返回true,则返回括号括起来的元素,否则返回nil"

我具体不明白的是,对“list(x)”的一系列连续调用最终将如何返回一个原子列表,例如 (1 2)。

最佳答案

不确定您为什么将问题标记为 SLIME,这是一个 IDE。

让我们格式化并缩进您的代码以使其可读。

(defun findAll (fct l)
  (cond
   ((null l) nil)
   ((mapcan (lambda (x)
              (if (funcall fct x)
                  (list x)
                nil))
            l))))

可以这样写,但通常我们有一个T条件来明确最后一个子句总是被调用。

(defun findAll (fct l)
  (cond
   ((null l) nil)
   (t (mapcan (lambda (x)
                (if (funcall fct x)
                    (list x)
                  nil))
              l))))

由于 MAPCAN 已经处理空列表,您可以只删除 COND 和第一个子句。 findAll 通常命名为 find-all

(defun find-all (fn list)
  (mapcan (lambda (item)
            (if (funcall fn item)
                (list item)
              nil))
          list))

For each of the elements of the list l call the lambda function. If the result of the function fit and the element x returns true, then return the element surrounded by parentheses, otherwise return nil

对于列表 LIST 的每个元素调用 lambda 函数。如果函数 FN 和元素 ITEM 的结果返回 true,则返回仅包含 ITEM 的列表,否则返回空列表。最终结果是 lambda 函数的所有结果列表的(破坏性的)附加列表。

关于lisp - 为什么这个程序返回一个原子列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46473092/

相关文章:

linux - 在 Linux 上获取 Common Lisp 进程 ID

list - Lisp 遍历函数中的列表

lisp - 我的 Lisp 代码无法运行,但函数本身可以编译

lisp - 为什么SBCL会这样打印Sublis?

lisp - Lisp 中的 Flatten Nests 函数 - 需要帮助理解

lisp - 如何在 lisp 中计算两次(不使用 eval)

optimization - 如何优化我的递归 Lisp 函数

common-lisp - Common Lisp CFFI 和 C 退出代码

lisp - 如何使用 Lisp 中的迭代函数打印列表中奇数位置的元素?

lisp - 常见的 lisp 函数/特殊形式/宏/等是什么。名字的意思,我在哪里可以找到这些信息?