2009-12-07 125 views
3

有什麼區別:Lisp的差異(利弊,A(利弊'B 'C))和(缺點' A「(BC))

(cons 'a (cons 'b 'c)) ;; (A B . C) 

(cons 'a '(b.c)) ;; (A B.C) 

我需要創建以下列表((ab).c)使用缺點,所以我試圖理解那個「。」。代表。

L.E.:我有以下(cons (cons 'a 'b) 'c)但它產生((A . B) . C)而不是((A.B).C)(注意多餘的空格)

+2

A.B是不是一個符號?我不認爲。如果周圍沒有空間,就會像操作員一樣行動。儘管如此,我還是有興趣尋找其他方法。 – 2009-12-07 12:50:23

回答

6

空格用於分隔列表標記。 A.B是一個單一的令牌。(A.B)是一個包含單個元素的列表。 (A . B)是作爲汽車的A和作爲cdr的B的cons cell。

cons cell是一對「事物」(對象)。在你的情況下,這些東西是符號,它們被命名爲AB等。例如,這種單元的打印表示是(A . B)。這被稱爲「點符號」。第一個元素叫做「car」,第二個「cdr」。

功能cons創建這樣一個單元格。 (cons 'a 'b)因此產生單元(A . B)請注意,名稱始終在內部加註

這很可能是你的老師想要的,所以((A . B) . C)是正確的輸出,你的代碼是正確的答案。這是汽車指向另一個單元格的單元格,而cdr包含C。該另一個單元是一個車廂包含A和cdr B的單元。

順便說一句,列表是這樣的cons單元的線性鏈,使得汽車總是保持一個值,並且cdr指向列表的其餘部分。最後一個cdr指向無處(在Lisp中稱爲NIL)。在點符號中,列表例如是(A . (B . (C . NIL)))。由於列表很重要,因此它們可以寫成如下所示:(A B C)。如果最後的CDR具有一個值而不是NIL,則它用點符號表示,例如, (A . (B . (C . D))))可以寫成(A B C . D)

6

.兩個字符之間是一個符號的一部分。 b.c是一個帶有三個字符名稱的符號:bc

如果輸入FOO.BAR,那麼Lisp會將其作爲一個符號讀取。

如果你輸入(FOO.BAR),那麼Lisp會把它作爲一個帶有一個符號作爲其內容的列表讀取。

如果輸入(FOO . BAR)然後Lisp的將它讀成與FOO一個cons單元作爲CARBARCDR

.用於將CAR分離和cons單元的CDR(a . b)。請注意0​​附近的空間。

(cons 'b 'c)創建與符號b作爲CAR和作爲CDR符號c一個cons單元。它被寫爲(b . c)

(cons 'a '(b.c))創建兩個符號的列表,ab.c。它被寫爲(a b.c)

((A.B).C)始終打印爲((A.B) . C)。這也不是一個列表。

((a.b) . c)與列表(a.b)作爲CAR並作爲CDR符號c一個cons單元。

1

如果這是在學習lisp的過程中,這個問題可能並不意味着暗示了「不允許空間」規則,因爲空格對括號不重要,正確的答案就是你給的。

特別是,右括號之後的空格總是被添加,但它僅用於人類可讀性目的。要求不要打印它沒有任何意義。