我是 lisp 新手,在使用“
append
”时遇到困难。我必须重新排序列表并将输入列表的第一个元素作为输出列表的最后一个元素。我尝试使用“append
”和“nconc
”,并且任何时候我得到我想要的列表,但在最后一个元素之前有一个“.
”。这个点是什么意思?有什么办法可以避免出现这个符号吗?
非常感谢!
(nconc (rest l) (first l)) >> (B C D E . A)
(append (rest l) (first l)) >> (B C D E . A)
在最基本的层面上,列表是通过一系列
cons
调用创建的:
(cons 1 2 ) ; (1 . 2)
(cons 1 (cons 2 NIL)) ; (1 2 . NIL) = (1 2)
(cons 1 (cons 2 3 )) ; (1 2 . 3)
(cons 1 (cons 2 (cons 3 NIL))) ; (1 2 3 . NIL) = (1 2 3)
NIL
是表示列表结束的特殊标记。因此,NIL
之后的.
可以与.
一起消失。但对于 .
之后的任何其他 atom,则不能。
append
是一个更高级别的函数,它附加两个列表:
; l = (1 2 3)
(append (rest l) (first l))
=
(cons 2 (cons 3 1))
=
( 2 3 . 1)
之所以如此,是因为这里的
first l
元素不是列表。(*)但是我们可以用它创建一个列表:
; l = (1 2 3)
(append (rest l) (list (first l)))
=
(cons 2 (cons 3 (list 1)))
=
(cons 2 (cons 3 (cons 1 NIL)))
=
( 2 3 1 . NIL )
=
( 2 3 1 )
nconc
在这方面就像append
。
(*) 也不是
NIL
在这种情况下,它将被视为列表标记的末尾,并与点一起消失。这表明 NIL
也是一个空列表:
; l = (NIL 2 3)
(append (rest l) (first l))
=
(cons 2 (cons 3 NIL))
=
( 2 3 . NIL )
=
( 2 3 )
; l = ((0 1) 2 3)
(append (rest l) (first l))
=
(cons 2 (cons 3 (list 0 1)))
=
( 2 3 . (0 1) )
=
( 2 3 0 1 )