Common Lisp Cons Cell的定義究竟是什麼? Cons Cell與標準鏈表項目有何不同?畢竟,cons單元格和鏈接列表項都有一個值和一個指向下一個單元格或項目的指針......或者這種理解是否錯誤?什麼是Lisp Cons Cell的定義?
回答
Cons單元通常擁有兩個指針,可以指向任何東西。一般用法當然是指向左邊的一個「值」,另一個是「右邊」的另一個Cons單元(或零)。
cons cell也可以直接保存值,而不需要指針。由(cons 1 2)製作的交流單元將有指向數字的指針,但可以直接存儲它們(對於其他一些小型項目(如字符)也是如此)。 – 2009-08-23 07:23:45
將不會有指向數字的指針,我的意思是 – 2009-08-23 07:24:24
cons單元比鏈表節點更接近二叉樹節點。 car和cdr返回兩個孩子,可以是零,原子或其他的缺陷細胞。
爲了強調這裏的區別,沒有要求第二個元素必須是另一個cons單元。 ('豆腐1)'是一個有效的反應池。 – Chuck 2009-08-22 21:18:48
在Lisp中,cons單元包含一對值。如果單元格位於變量c
中,則(car c)
返回第一個值,(cdr c)
返回第二個值。
按照慣例,一個列表由cons單元格組成,其中單元格的car
包含節點值,並且cdr
包含對下一個節點的引用或nil(空列表)以指示列表的結尾。當原語函數返回或接受列表時,這是呈現列表的格式。
因此,對於該列表l
,(car l)
給人的第一元件(在第一cons單元的值)和(cdr l)
返回列表的尾部(在列表中的下一cons單元)。
我認爲這裏的其他答案雖然準確,但對一件事並不明確。
在傳統的C++鏈表實現中,兩個字段(val
和next
,例如)是,其類型爲。 next
定義爲指向列表中的另一個節點,其中null
是終結符。你不能指向任何東西,但另一個節點next
。
的Lisp是動態類型,所以,在cons單元或者字段可以是任何(無論是一個原子或一參考)。你可以用cons單元實現一個鏈表(這是一個Lisp列表:一個帶有終止符的nil
的cons單元鏈),但是你也可以在每個字段中使用一個cons單元作爲座標對,一棵樹節點等
你甚至可以結合這些;例如,的x
y
座標的列表:
;; (cons foo (cons bar nil)) == (list foo bar)
(cons
(cons 5 4)
(cons (cons 9 10) nil))
=>
((5 . 4) (9 . 10))
甲cons單元因此嚴格大於一個鏈接列表節點更一般;它更接近於「應用對」,可以這麼說。所有標準列表處理函數(map
,dolist
等)都是假設的簡單函數,您將值放入car
中,並將其他列表放入cdr
中。
這一切都意味着 - 如果你想 - 你可以定義列表向後,用car
指向下一個利弊細胞和cdr
指向的值!要做到這一點與鏈表節點,你必須重新定義類或數據結構來改變類型。
A cons
單元格是由cons
,car
和cdr
組成的合同的三分之一,其要求如同其他人所提及的那樣,它們表現爲配對。
從這個定義中刪除「參考」,「指針」等詞語的原因是要認識到這些是實現細節。如果你願意,你可以建立一個cons
憑空作爲阿伯爾森和薩斯曼做的:
(define (cons a b) (lambda (x) (x a b)))
(define (car x) (x (lambda (a b) a)))
(define (cdr x) (x (lambda (a b) b)))
這個定義完全是生活的Lisp世界的定義和功能裏面,甚至沒有停下來考慮是否對象被存儲爲值或引用;但這些可以作爲原始對象的替代(不考慮可變性或其他特殊用途)。
- 1. #+:和#的含義是什麼#::in common lisp
- 2. lisp爲什麼說這個函數是未定義的?
- 3. N-Queen Lisp(1- n)是什麼意思?
- 4. Common Lisp:什麼是#+零?
- 5. 爲什麼我的小lisp不會QUOTE?
- 6. 自定義MoreNavigationController的Cell
- 7. Lisp中的函數「defs」是什麼?
- 8. 這是使用cons的列表的定義嗎?
- 9. Lisp/Scheme中的'(撇號)是什麼?
- 10. 什麼是LISP中的宏的謂詞
- 11. 在Lisp中,推送是爲了什麼而添加的?
- 12. BDD的定義是什麼?
- 13. va_list的定義是什麼?
- 14. 用lambda定義cons,car和cdr - 它是如何工作的?
- 15. LISP中的#是什麼意思
- 16. 你推薦的Emacs Lisp是什麼?
- 17. Emacs Lisp和Common Lisp之間的主要區別是什麼?
- 18. lisp的自定義'+'(總和)函數
- 19. In Common Lisp什麼是印刷表示?
- 20. 如果我在URL中暴露實體鍵,pro/cons是什麼?
- 21. 在Lisp中使用cons函數的問題?
- 22. Lisp文件擴展名的約定是什麼?
- 23. Common Lisp的包定義
- 24. LISP的瀏覽定義
- 25. 在自定義TableView Cell中的UIWebView
- 26. DataWarehouse - 什麼是好定義?
- 27. Cons在這個功能中做了什麼?
- 28. Lisp的SYMBOL-PACKAGE-鎖定ERROR
- 29. Lambda微積分CONS對利用Lisp實現
- 30. Common-Lisp:綁定形式參數,正是通過了什麼?
每一個列表(除了'nil')都是一個cons單元,但不是每個單元格都是一個列表(如果它的'cdr'不是一個列表) – mihi 2009-08-22 21:31:33
我只是想澄清一下,我在比較一個Common Lisp列表及其缺點單元格,以及像C,C++或Java這樣的語言實現的常規可見列表及其項目。 – 2009-08-22 23:26:57