[英]LISP: Reversing a dotted list
Common Lisp: A Gentle Introduction中有一個問題。 問題是獲取列表中的最后一個元素而不是cons cell 。 宏LAST
以虛線列表的形式返回cons cell
。 提出的問題是使用宏reverse
而不是last
,但clisp
和sbcl
都拋出錯誤。
(reverse '(a b c . d))
=> error
CLHS 文檔說我們只能反轉一個適當的列表(序列)而不是一個點列表或一個循環列表。
編輯
我已經使用LAST
編寫了程序。
(defun last-element (x)
"x is a list with last element as dotted pair"
(cdr (last x)))
我不確定在這種情況下如何使用reverse
。
function last
返回任何適當列表或虛線列表的最后一個cons
單元格,只要該列表不是循環的。
聽起來這個問題是關於練習 6.6 的:
使用 LAST function 編寫一個名為 LAST-ELEMENT 的 function,它返回列表的最后一個元素而不是最后一個 cons 單元格。 使用 REVERSE 而不是 LAST 編寫另一個版本的 LAST-ELEMENT。 使用 NTH 和 LENGTH 編寫另一個版本。
如果這是意圖,練習將指定點列表輸入。 當list以不合格的方式使用時,它幾乎總是意味着正確的 list 。 對於適當的列表last
將在cdr
中返回一個帶有nil
的cons
單元格,例如(last '(ab c d)
--> (d. nil)
或只是(d)
,因此適當列表的最后一個元素是最后一個cons
牢房的car
。
如果您想同時處理正確列表和虛線列表,則需要確定輸入是哪個並相應地處理它:對於虛線列表,最后一個“元素”將是最后一個cons
單元格的cdr
。 相應地處理reverse
版本的輸入意味着您必須在應用reverse
之前確定輸入是正確的列表還是虛線列表。 在使用reverse
之前,您可以編寫 function 將虛線列表轉換為正確的列表。
從技術上講, 標准不認為終止虛線列表的原子是其元素之一:
元素 n。 1.(一個列表的)一輛 object 是組成列表的其中一輛 conses 的汽車。
對於像(ab c d)
這樣的適當列表, nil
是終止原子(因為(ab c d)
與 (ab c d.nil) 相同),並且(d. nil)
(ab c d. nil)
最后一個缺點; d
是最后一個cons
的car
,因此是列表的最后一個元素。 對於像(ab c. d)
這樣的虛線列表, d
是終止原子,而(c. d)
是最后一個cons
。 由於c
是最后一個cons
的car
,因此c
是虛線列表在標准中定義的意義上的最后一個真元素。 說d
是(ab c. d)
的最后一個成員可能更准確。
但是, Common Lisp 中的練習 6.6:簡單介紹僅適用於適當的列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.