[英]Lisp - Get rid of dotted list
我正在構建一個函數,Lisp ta反轉了列表的第一個和最后一個元素。 我得到一個列表,其中有一輛car
和一個cdr
因此為什么我的輸出中有一個點。 有沒有辦法刪除點?
(defun my-butlast (list)
(loop for l on list
while (cdr l)
collect (car l)))
(defun f-l-swap(list)
(append (last list)(cdr (my-butlast list))(car list))
)
(write(f-l-swap '(A B C D E)))
OUTPUT:
(E B C D . A)
append
期望參數為列表。 在您的情況下(car list)
是一個原子。 如果要堅持使用append
則必須將其更改為list。 即:
(defun f-l-swap (list)
(append (last list)
(cdr (my-butlast list))
(list (car list))))
列表是一對cons
對。 例如。 (1 2 3)
是(1 . (2 . (3 . ())))
的可視化。 如果最后一個cdr
不是()
您擁有一個點列表,因為這沒有最后一部分的簡化可視化。 它必須印有一個點。
您有(E . (B . (C . (D . A))))
並想擁有(E . (B . (C . (D . (A . ())))))
。 你看得到差別嗎? (car list)
不是列表,而是一個要素,這就是為什么您得到一個虛線列表的原因。
這是append
和butlast
更明智的實現:
(defun my-append (a b)
(if (null a)
b
(cons (car a) (my-append (cdr a) b))))
那僅支持2個參數,但更多的想法是它繼續進行,直到您同意所有先前的列表並且僅剩一個,逐字成為尾巴。 這看起來可能是這樣:
(defun my-append2 (x &rest xs)
(labels ((helper (x xs)
(cond ((null xs) x)
((null x) (helper (car xs) (cdr xs)))
(t (cons (car x) (helper (cdr x) xs))))))
(helper x xs)))
這是butlast
(defun my-butlast (xs)
(if (null (cdr xs))
'()
(cons (car xs) (my-butlast (cdr xs)))))
現在,應該使用高階函數或loop
來真正做到這一點,但隨后您就會發現隱藏列表工作原理的事實。 上面的代碼顯示了它們是否起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.