簡體   English   中英

Lisp-擺脫虛線列表

[英]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)不是列表,而是一個要素,這就是為什么您得到一個虛線列表的原因。

這是appendbutlast更明智的實現:

(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM