2012-10-28 8 views
7

Czy ktoś może podać mi podstawowe wyjaśnienie, jakie zmiany w car i cdr zrobić w Scheme?Wyjaśnienie CAR, CDR, CADAR, itp.

Jeśli mam rację, car zwróci pierwszą pozycję na liście. cdr zwróci listę wykluczającą pierwszy element.

jestem zdezorientowany na innych odmian tych dokładniej rzeczy jak cadar, caddr, cddr itp

Say mam to jako losowy przykład:

define X '(a b (c d e)) 

(car X) 
(cdr X) 
(cadr X) 
(cadar X) 

(car X) przyniosłoby , (cdr X) produkuje (b (c d e)), cadr będzie produkować b. Ale nie wiem, jak wywnioskować jakikolwiek inny wariant car/cdr, taki jak cadar.

Odpowiedz

15

Można wywnioskować znaczenie tych funkcji przez analizowanie ich nazwy:

od pierwszej litery („C”) i ostatni („R”), a „a” oznacza „samochód” i a "d" oznacza "cdr".

Więc:

  • cadr jest "samochód CDR"
  • cddr jest cdr cdr,
  • cadar jest "samochód CDR samochodu" (w ten sposób parametr musi być listą listy),
  • itp
+0

To naprawdę pomogło! Nigdy nie myślałem o przejrzeniu pomiędzy c i r, a następnie szukaniu albo a lub d. To ma dla mnie największy sens. –

4

Najprostszym sposobem jest wprowadzenie go do programu tłumacza:

(car X) -> a 
(cdr X) -> (b (c d e)) 
(cadr X) -> (car (cdr X))  -> (car '(b (c d e))) -> b 
(cadar X) -> (car (cdr (car X))) -> (car (cdr 'a))  -> error 

Gdy masz więcej niż jeden a lub d, jak widać na przykładzie cadr, można ją przeczytać w tył. Najpierw podejmij cdr (d) argumentu, a następnie pobierz car (a) z wyniku, i tak dalej, aż dojdziesz do pierwszego.