我必須在方案中編寫一個函數來訪問下面列表中的元素'a'。 「(1(2 4 5))訪問方案列表中的元素
我寫
(car (cdr (cdr '(1 (2 a 4 5)))))
,但我得到的錯誤
"car: contract violation
expected: pair?
given: '()"
如何解決這個工作?
我必須在方案中編寫一個函數來訪問下面列表中的元素'a'。 「(1(2 4 5))訪問方案列表中的元素
我寫
(car (cdr (cdr '(1 (2 a 4 5)))))
,但我得到的錯誤
"car: contract violation
expected: pair?
given: '()"
如何解決這個工作?
我們先來看(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))
(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)))))
或者如果你只是看一次的字母,並在末尾添加在開始c
和r
它(cadadr '(1 (2 a 4 5)))
知道(1 2 3 4)
是(1 . (2 . (3 . (4 .()))))
這是非常重要的,如果你想第3個元素是cddr
或caddr
的car
。查看點符號時,從右到左閱讀a
和d
。要成爲cxr
的母語人士,您需要做很多這些工作。點符號og ((1) (2))
將如何顯示?你如何訪問2
?
當然,這對(1 . 2)
一個用(cons 1 2)
。
從@ 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)))
獲得相同的結果。
請記住「不可見」空列表。這似乎是什麼讓你絆倒。