簡體   English   中英

LISP:反轉點列表

[英]LISP: Reversing a dotted list

Common Lisp: A Gentle Introduction中有一個問題。 問題是獲取列表中的最后一個元素而不是cons cell LAST以虛線列表的形式返回cons cell 提出的問題是使用宏reverse而不是last ,但clispsbcl都拋出錯誤。

(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中返回一個帶有nilcons單元格,例如(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是最后一個conscar ,因此是列表的最后一個元素。 對於像(ab c. d)這樣的虛線列表, d是終止原子,而(c. d)是最后一個cons 由於c是最后一個conscar ,因此c是虛線列表在標准中定義的意義上的最后一個真元素 d(ab c. d)的最后一個成員可能更准確。

但是, Common Lisp 中的練習 6.6:簡單介紹僅適用於適當的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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