问题描述
在查看Bert Burgemeister的"Common Lisp快速参考"时,我偶然发现了tailp
.
While looking through the "Common Lisp Quick Reference" by Bert Burgemeister, I stumbled over tailp
.
首先,我误解了此函数的定义.我尝试过:
First, I misunderstood the definitions of this function. And I tried:
(tailp '(3 4 5) '(1 2 3 4 5))
但它回来了
NIL
CLTL2说,tailp
是正确的 iff ,第一个参数是具有n
的任何(nthcdr n list)
.
CLTL2 says, tailp
is true iff the first argument is any (nthcdr n list)
with existing 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
寻找cdr
的cdr
甚至共享同一地址):
Until I tried (and then understood tailp
looks for cdr
of l
which share even the same address):
(defparameter l '(1 2 3 4 5 6))
(tailp (nthcdr 3 l) l)
;; T
但随后我有下一个问题:
But then I had my next question:
For what such a function is useful at all?
看起来子列表是否属于列表的功能会更有用吗? (或者看起来像是列表的一部分,而不是它必须共享相同的地址?)
Wouldn't be a function more useful which looks whether a sublist is part of a list? (Or looks like a part of a list, instead that it has to share the same address?)
备注:
好吧,慢慢地,我开始理解,也许这是列表的cdr
部分的eq
...一种...给定列表cdr-衍生物>进入第一个参数?".
Ah okay slowly I begin to understand, that maybe that this is kind of a eq
for cdr
parts of a list ... Kind of ... "Any cdr
-derivative of given list eq
to the first argument?".
但是也许有人可以向我解释这种测试在哪些情况下非常有用?
But maybe someone can explain me in which situations such test is very useful?
在与@Lassi的漫长讨论中在这里,我们发现:
In a long discussion with @Lassi here, we found out:
切勿在通函列表上使用tailp
!
Never Use tailp
On Circular Lists!
因为行为是不确定的(在SBCL中已经出现问题).因此tailp
用于非圆形列表.
Because the behavior is undefined (already in SBCL problematic).So tailp
is for usage on non-circular lists.
推荐答案
tailp
的基本目的是检查是否存在共享的列表结构.这意味着 cons单元格是否相同(这意味着EQL
作为谓词)-不仅仅是cons单元格的内容.
The basic purpose of tailp
is to check whether there is list structure shared. This means whether the cons cells are the same (which means EQL
as a predicate) - not just the content of the cons cells.
还可以检查项目是否位于最后一个cdr
中:
One can also check if an item is in the last 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中很少使用的功能之一.
This is one of the rarely used functions in Common Lisp.
这篇关于了解Common Lisp中的函数`tailp`的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!