Gwa*_*Kim 4 lisp clisp common-lisp
在浏览Bert Burgemeister的"Common Lisp Quick Reference"时,我偶然发现了tailp.
首先,我误解了这个函数的定义.我试过了:
(tailp '(3 4 5) '(1 2 3 4 5))
Run Code Online (Sandbox Code Playgroud)
但它回来了
NIL
Run Code Online (Sandbox Code Playgroud)
CLTL2说,如果第一个参数是任何存在的,tailp则为真.(nthcdr n list)n
(nthcdr 2 '(1 2 3 4 5))
;; (3 4 5)
Run Code Online (Sandbox Code Playgroud)
我进一步尝试:
(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
Run Code Online (Sandbox Code Playgroud)
直到我尝试(然后理解tailp寻找cdrl甚至共享相同的地址.
(defparameter l '(1 2 3 4 5 6))
(tailp (nthcdr 3 l) l)
;; T
Run Code Online (Sandbox Code Playgroud)
但接下来我提出了下一个问题:
For what such a function is useful at all?
Run Code Online (Sandbox Code Playgroud)
看一个子列表是否属于alist的一部分,这不是一个更有用的函数吗?(或者看起来像列表的一部分,而不是它必须共享相同的地址?)
备注:
好吧,慢慢地我开始明白,也许这eq对于cdr列表的某些部分来说......有点......"任何cdr- 给定列表eq的第一个参数的衍生物?".
但也许有人可以解释我在哪种情况下这样的测试非常有用?
其基本目的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
Run Code Online (Sandbox Code Playgroud)
这是Common Lisp中很少使用的函数之一.