2010-12-15 10 views
5

Próbuję dowiedzieć się, jak to zrobić przy użyciu Wady:Jak to zrobić ((AB) (CD).) W LISP

((A . B) . (C . D))

gdzie (A . B) i (C . D) są w każdej komórce

minusy

próbowałem robić to (cons (cons 'a 'b) (cons 'c 'd)) ale daje mi to:

((A.B) C . D)

ja też tr IED to: (cons (cons 'a 'b) (cons (cons 'c 'd)())) ale daje mi to:

((A . B) (C . D))

Każdy pomysł jak to osiągnąć?

+5

Drugi wygląda to, co chcesz. W jaki sposób nie jest odpowiedni? –

+0

@Anon: Drugi nie ma środkowej kropki. W rzeczywistości jest to inna wartość, ponieważ istnieje tam zerowa (pusta lista). –

Odpowiedz

0

Nie jestem całkiem pewien, co masz na myśli ... Zgadzam się z powyższym komentarzem, że ostatnia linia twojego kodu przypomina pierwszą, do której pasujesz.

Oto przyzwoity ogólny zasób dla ciebie tak czy owak: http://www-2.cs.cmu.edu/~dst/LispBook/

7

Wystarczy spojrzeć na to, co dostajesz z powrotem, kiedy wchodzi w dosłownym ((A . B) . (C . D)):

 
* '((a . b) . (c . d)) 

((A . B) C . D) 

Jest defined algorithm Lisp drukarka używa do druku poza strukturami danych zbudowanymi z par. Zasadniczo, nigdy nie można uzyskać wad, które będą drukowane w postaci kropkowanej pary w nawiasach, gdy jest to CDR innych wad.

Jednak możliwe jest, aby ponownie skonfigurować drukarkę tak, aby uzyskać zachowanie, którego szukasz, poprzez SET-PPRINT-DISPATCH:

 
(set-pprint-dispatch 'cons 
    (lambda (stream object) 
    (format stream "(~W . ~W)" (car object) (cdr object)))) 
 
* '((a . b) . (c . d)) 

((A . B) . (C . D)) 
* (cons (cons 'a 'b) (cons 'c 'd)) ;The same object 

((A . B) . (C . D)) 

Chociaż mimo że byłoby to szczerze być lepiej w długi czas, jeśli masz komfort z odczytaniem domyślnego zachowania.

0

Czego szukasz, nie jest możliwe, ponieważ listy są reprezentowane w Lisp. Tworząc listę, tworzysz serię komórek cons, gdzie samochód komórki jest wartością tego elementu na liście, a cdr jest odniesieniem do następnej komórki. Żądana komórka, ((A . B) . (C . D)) oznacza "Utwórz komórkę cons, gdzie samochód jest (A . B), a cdr jest (C . D)". Jest to odpowiednik listy, w której pierwszym elementem jest (A . B), drugim elementem jest C, a końcem listy jest D lub ((A . B) C . D).

+0

Zgadzam się, ponieważ mówisz, że nie jest to możliwe, a następnie wyjaśnij, dlaczego jest to odpowiednik jego pierwszej próby! –

+0

Targi. Mówiłem, że nie można uzyskać tłumacza, który dałby wynik, o który mu chodziło. –

15

Pierwszy jest tym, co chcesz. Są one równoważne. Można sprawdzić w ten sposób:

1 ]=> (cons (cons 'a 'b) (cons 'c 'd)) 

;Value 11: ((a . b) c . d) 

1 ]=> (car (cons (cons 'a 'b) (cons 'c 'd))) 

;Value 12: (a . b) 

1 ]=> (cdr (cons (cons 'a 'b) (cons 'c 'd))) 

;Value 13: (c . d) 

Pamiętaj listę jest komórka minusy. "Samochód" jest głównym elementem listy lub pierwszej połowy komórki - cons, a cdr to reszta listy lub drugi element komórki.

Innym sposobem, aby upewnić się, że są one równoważne:

1 ]=> '((a . b) . (c . d)) 

;Value 14: ((a . b) c . d) 
+0

Dzięki za pomoc Laurence! To świetna sztuczka, jeśli są one równoważne – darkwingcode