有什麼區別: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)
(注意多餘的空格)
有什麼區別: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)
(注意多餘的空格)
空格用於分隔列表標記。 A.B
是一個單一的令牌。(A.B)
是一個包含單個元素的列表。 (A . B)
是作爲汽車的A
和作爲cdr的B
的cons cell。
cons cell是一對「事物」(對象)。在你的情況下,這些東西是符號,它們被命名爲A
,B
等。例如,這種單元的打印表示是(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)
。
.
兩個字符之間是一個符號的一部分。 b.c
是一個帶有三個字符名稱的符號:b,。和c。
如果輸入FOO.BAR
,那麼Lisp會將其作爲一個符號讀取。
如果你輸入(FOO.BAR)
,那麼Lisp會把它作爲一個帶有一個符號作爲其內容的列表讀取。
如果輸入(FOO . BAR)
然後Lisp的將它讀成與FOO
一個cons單元作爲CAR和BAR
爲CDR。
.
用於將CAR分離和cons單元的CDR:(a . b)
。請注意0附近的空間。
(cons 'b 'c)
創建與符號b
作爲CAR和作爲CDR符號c
一個cons單元。它被寫爲(b . c)
。
(cons 'a '(b.c))
創建兩個符號的列表,a
和b.c
。它被寫爲(a b.c)
。
((A.B).C)
始終打印爲((A.B) . C)
。這也不是一個列表。
((a.b) . c)
與列表(a.b)
作爲CAR並作爲CDR符號c
一個cons單元。
如果這是在學習lisp的過程中,這個問題可能並不意味着暗示了「不允許空間」規則,因爲空格對括號不重要,正確的答案就是你給的。
特別是,右括號之後的空格總是被添加,但它僅用於人類可讀性目的。要求不要打印它沒有任何意義。
A.B是不是一個符號?我不認爲。如果周圍沒有空間,就會像操作員一樣行動。儘管如此,我還是有興趣尋找其他方法。 – 2009-12-07 12:50:23