2010-12-15 13 views
5

Ich versuche, herauszufinden, wie man dies mit Nachteilen zu tun: Zelle in jedem consvorgehen ((AB) (CD).) In Lisp

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

wo (A . B) und (C . D) sind

ich habe versucht, dies zu tun (cons (cons 'a 'b) (cons 'c 'd)) aber es gibt mir diese:

((A.B) C . D)

ich auch tr ied dies: (cons (cons 'a 'b) (cons (cons 'c 'd)())) aber es gibt mir dies:

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

Jede Idee, wie dies zu erreichen?

+5

Die zweite sieht aus wie, was Sie wollen. Inwiefern ist es nicht geeignet? –

+0

@Anon: Die zweite hat nicht den mittleren Punkt. Es ist eigentlich ein anderer Wert, weil dort eine Null (leere Liste) ist. –

Antwort

0

Ich bin nicht ganz sicher, was du meinst ... Ich stimme dem obigen Kommentar zu, dass die letzte Zeile deines Codes der ersten ähnelt, mit der du übereinstimmst.

Hier ist eine anständige allgemeine Ressource für Sie sowieso: http://www-2.cs.cmu.edu/~dst/LispBook/

7

Betrachten Sie einfach, was Sie zurück erhalten, wenn Sie in einem wörtlichen ((A . B) . (C . D)) eingeben:

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

((A . B) C . D) 

Es gibt eine defined algorithm ist der Lisp-Drucker zum Drucken verwendet out Datenstrukturen aus Paaren aufgebaut. Grundsätzlich kann man nie einen Minuspunkt als gepunkteten Strich in Klammern angeben, wenn es sich um den CDR eines anderen Kontras handelt.

Allerdings ist es möglich, den Drucker neu zu konfigurieren, so dass Sie das Verhalten erhalten Sie suchen, über 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)) 

Obwohl trotz, dass es offen in die besser wäre, Langlauf, wenn Sie sich mit dem Standardverhalten vertraut gemacht haben.

0

Was Sie suchen, ist nicht möglich, weil Listen in Lisp dargestellt werden. Wenn Sie eine Liste erstellen, erstellen Sie eine Reihe von Cons-Zellen, wobei das Auto der Zelle der Wert dieses Elements in der Liste ist und das Cdr eine Referenz auf die nächste Cons-Zelle ist. Ihre gewünschte Zelle, ((A . B) . (C . D)) bedeutet "Erstellen Sie eine Cons-Zelle, wo das Auto ist (A . B) und die Cdr ist (C . D)". Dies entspricht einer Liste, in der das erste Element (A . B) ist, das zweite Element C und das Ende der Liste oder ((A . B) C . D) ist.

+0

Ich habe abgelehnt, weil Sie sagen, dass es nicht möglich ist, dann erklären, warum es gleich zu seinem ersten Versuch ist! –

+0

Messe. Ich sagte, es sei unmöglich, den Dolmetscher dazu zu bringen, die von ihm gewünschte Ausgabe zu geben. –

15

Die erste ist, was Sie wollen. Sie sind gleichwertig. Sie können wie folgt überprüfen:

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) 

Denken Sie daran, eine Liste ist eine cons Zelle. Das "Auto" ist das Kopfelement der Liste oder die erste Hälfte der Cons-Zelle, und das Cdr ist der Rest der Liste oder das zweite Element der Cons-Zelle.

Ein anderer Weg, um sicherzustellen, dass sie sind gleichwertig:

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

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

Danke für Ihre Hilfe Laurence! Das ist ein cooler Trick, wenn sie gleichwertig sind – darkwingcode