【问题标题】:Return value in LispLisp 中的返回值
【发布时间】:2012-09-20 15:07:26
【问题描述】:

所以我昨天开始学习 Lisp 并开始做一些问题。

我很难做的事情是在列表中插入/删除原子,同时保持列表相同:(delete 'b '(g a (b) l)) 将给我(g a () l)

我遇到的问题也是这个问题。 我想检查列表中是否存在原子。

我跟踪它,它说它在某一时刻返回 T,但随后被 nil 覆盖。

你们能帮忙吗:)?

我正在使用(appear-anywhere 'a '((b c) g ((a))))

在第 4 个函数调用时,它返回 T,但随后变为 nil

(defun appear-anywhere (a l)
  (cond
   ((null l) nil)
   ((atom (car l))
    (cond
     ((equal (car l) a) T)
     (T (appear-anywhere a (cdr l)))))
   (T (appear-anywhere a (car l))(appear-anywhere a (cdr l)))))

【问题讨论】:

  • 请注意,Common Lisp 中有一个delete 函数。它没有上述行为。如果您定义自己的函数delete,那么行为不再由 Common Lisp 标准定义,并且基本上取决于您的 Lisp 在这种情况下所做的任何事情。当然,您可以制作自己的符号包(一种命名空间),其中包含 delete 符号,与 cl:delete 无关。

标签: recursion lisp return


【解决方案1】:

让我们看一个明显的问题:

(defun appear-anywhere (a l)
  (cond
   ((null l) nil)
   ((atom (car l))
    (cond
     ((equal (car l) a) T)
     (T (appear-anywhere a (cdr l)))))
   (T (appear-anywhere a (car l))(appear-anywhere a (cdr l)))))

想想上面的最后一行。

让我们稍微改变一下格式。

(defun appear-anywhere (a l)
  (cond
   ((null l) nil)
   ((atom (car l))
    (cond
     ((equal (car l) a) T)
     (T (appear-anywhere a (cdr l)))))
   (T
    (appear-anywhere a (car l))
    (appear-anywhere a (cdr l)))))

最后三行:所以默认情况下(这就是T 存在的原因)最后两个表格将被计算。首先是第一个,然后是第二个。第一种形式的值永远不会被使用或返回。

这可能不是你想要的。

当前,当a 的值出现在列表的其余部分中时,您的代码只会返回一些内容。第一种形式从未真正使用过。

提示:什么是正确的逻辑连接符?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 2022-11-27
    • 2021-09-20
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多