2017-03-17 82 views
1

我必須在方案中編寫一個函數來訪問下面列表中的元素'a'。 「(1(2 4 5))訪問方案列表中的元素

我寫

(car (cdr (cdr '(1 (2 a 4 5))))) 

,但我得到的錯誤

"car: contract violation 
    expected: pair? 
    given: '()" 

如何解決這個工作?

回答

0

我們先來看(2 a 4 5)。這是四個元件的列表:2,2,4和,可以使用函數cons構造5. 這樣的列表值:

(cons 2 (cons 'a (cons 4 (cons 5 '())))) 

'()哪裏是空列表。

名單(1 X)可以這樣創建:

(cons 1 (cons X '())) 

組合第二表達我們看到

(cons 1 (cons (cons 2 (cons 'a (cons 4 (cons 5 '())))) '())) 

將構建列表(1 (2 a 4 5))第一個表達式。

現在我們準備看個究竟:

> (cdr (cons 1 (cons (cons 2 (cons 'a (cons 4 (cons 5 '())))) ; the car 
     '())))             ; the cdr 
(cons (cons 2 (cons 'a (cons 4 (cons 5 '())))) '())   ; 

> (cdr (cdr (cons 1 (cons (cons 2 (cons 'a (cons 4 (cons 5 '())))) '()))) 
= (cdr (cons (cons 2 (cons 'a (cons 4 (cons 5 '())))) ; the car 
       '())          ; the cdr 
= '() 

> (car (cdr (cdr (cons 1 (cons (cons 2 (cons 'a (cons 4 (cons 5 '())))) 
         '())))) 
= (car '()) 
= ERROR 

在REPL試試這個,然後看看你能弄清楚如何進行:

(car (cdr the-list-expression)) 
0

(1 (2 a 4 5)點標記是: (1 . ((2 . (a . (4 . (5 .())))) .()))。對於每一對(a . d)你使用c a r得到第一個和第二個。如果你看一下點符號需要傳遞d得到((2 . (a . (4 . (5 .())))) .()),然後a得到(2 . (a . (4 . (5 .())))),然後d得到(a . (4 . (5 .()))),然後a得到a。您可以從最終命令他們開始這樣(car (cdr (car (cdr '(1 (2 a 4 5)))))或者如果你只是看一次的字母,並在末尾添加在開始cr(cadadr '(1 (2 a 4 5)))

知道(1 2 3 4)(1 . (2 . (3 . (4 .()))))這是非常重要的,如果你想第3個元素是cddrcaddrcar。查看點符號時,從右到左閱讀ad。要成爲cxr的母語人士,您需要做很多這些工作。點符號og ((1) (2))將如何顯示?你如何訪問2

當然,這對(1 . 2)一個用(cons 1 2)

0

從@ soegaard的迴應... 引起問題的事情是,您有列表中包含一個列表。

開始(car (cdr '(1 (2 a 4 5)))),這是'(2 a 4 5),你現在需要從該列表中,您可以用單一的CADR程序做拉第二個項目,或者你可以嵌套他們,生產(car (cdr (car (cdr '(1 (2 a 4 5))))))

由於soegaard解釋,有在那裏是一個「不可見」的空列表,這就解釋了爲什麼你需要(car (cdr '(1 (2 a 4 5))))才能獲得列表。

請記住,'(2 a 4 5)是一個列表,所以你需要把它作爲一個列表。拿到cdr,然後從中拉出汽車。

正如@Sylwester指出的那樣,您可以將這些字母組合起來形成複合名稱。球拍最多支持四層,因此您可以創建您需要的一個(幾乎不),並使用(cadadr '(1 (2 a 4 5)))獲得相同的結果。

請記住「不可見」空列表。這似乎是什麼讓你絆倒。