gpt4 book ai didi

lisp - 理解 Common Lisp 中的函数 `tailp`

转载 作者:太空宇宙 更新时间:2023-11-03 18:39:04 25 4
gpt4 key购买 nike

在浏览 Bert Burgemeister 的“Common Lisp Quick Reference”时,我偶然发现了 tailp

首先,我误解了这个函数的定义。我试过:

(tailp '(3 4 5) '(1 2 3 4 5))

但它回来了

NIL

CLTL2 表示,tailp 为真 iff 第一个参数是任何 (nthcdr n list) 与现有的 n.

(nthcdr 2 '(1 2 3 4 5))
;; (3 4 5)

我进一步尝试:

(tailp '(3 4 5) '(1 2 3 4 5))
;; NIL - and I would expect: T following the definition above.

(tailp '() '(1 2 3 4 5))
;; T
(tailp '5 '(1 2 3 4 . 5))
;; T

直到我尝试(然后理解 tailp 寻找 lcdr,它们甚至共享相同的地址):

(defparameter l '(1 2 3 4 5 6))
(tailp (nthcdr 3 l) l)
;; T

但接下来我有下一个问题:

For what such a function is useful at all?

检查子列表是否是列表的一部分的函数不是更有用吗? (或者看起来是列表的一部分,而不是它必须共享相同的地址?)

备注:

啊,好吧,慢慢地我开始明白,也许这是一种 eq 用于列表的 cdr 部分......有点......“任何cdr - 第一个参数的给定列表 eq 的导数?”。

但也许有人可以解释一下这种测试在哪些情况下非常有用?

备注:

在与@Lassi 的长时间讨论中 here ,我们发现:

切勿在循环列表中使用 tailp!

因为行为未定义(在 SBCL 中已经有问题)。所以 tailp 用于非循环列表。

最佳答案

tailp 的基本目的是检查是否有共享的列表结构。这意味着 cons 单元格 是否相同(这意味着 EQL 作为谓词)——而不仅仅是 cons 单元格的内容。

还可以检查某个项目是否在最后一个 cdr 中:

CL-USER 87 > (tailp t '(1 2 3 4 . t))
T

CL-USER 88 > (tailp nil '(1 2 3 4 . nil))
T

CL-USER 89 > (tailp nil '(1 2 3 4))
T

CL-USER 90 > (tailp #1="e" '(1 2 3 4 . #1#))
T

这是 Common Lisp 中很少使用的函数之一。

关于lisp - 理解 Common Lisp 中的函数 `tailp`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50542453/

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