2010-11-19 9 views
2

LISP stumpft mich noch einmal ... Warum kann ich nicht den Wert des letzten Elements in einer Liste bekommen? Ich habe eine Liste aufgebaut ähnlich wie diese:LISP Auto des letzten Elements?

(setq bar '(((1 2) 3 4 5)((6 7) 8 9 10))) 

Jetzt bekomme ich eine Rendite von 4 für:

(caddar bar) 

Es ist eine Rückkehr von (5) für:

(cdddar bar) 

Aber ich kann nicht eine 5 bekommen für:

Warum ist das - ein d wie bekomme ich den Wert der 5?

Fehler:

; Warning: This function is undefined: 
; CADDDAR 

Error in KERNEL:%COERCE-TO-FUNCTION: the function CADDDAR is undefined. 
[Condition of type UNDEFINED-FUNCTION] 

Antwort

8

Die Funktionen mit 5 oder mehr a's und d's sind nicht definiert. Nur 4 und weniger. Es gibt zu viele mögliche Funktionen dieser Länge, um praktisch zu sein.

Sie müssen nur es buchstabieren: (car (cdr (cdr (cdr (cdr (car x))))))

+0

Die Antwort war: (Auto (cdddar lst)) .... jetzt warum das! = Cadddar, verstehe ich nicht. – toast

+2

Irgendwo tief in den Eingeweiden Ihrer LISP-Implementierung sind: (defun cadr (x) ...) (defun cdar (x) ...) (defun caar (x) ...) (defun cddr (x) ...) usw. für alle Kombinationen von 'a' und 'd' der Länge 1 bis 4. Die Spezifikation enthält nicht diejenigen der Länge 5, da es zu viele sind. Es gibt nichts Besonderes an der # cdadr-Familie von Funktionen. Sie werden nicht auf eindeutig interpretiert geparst. Sie sind nur normale Funktionen. Sie sind herzlich willkommen, einige neue Lücken zu füllen. – jtdubs

2

Nun, pro der Fehlermeldung gibt es keine cadddar Funktion. Beachten Sie, dass car und cdr die primitiven Funktionen zum Lesen von Listen sind. Andere wie caddar sind Komfortfunktionen, die aus einer Kombination von einem oder mehreren car und cdr aufgebaut sind. Das heißt, Sie konnten Listenmanipulation nur mit car und cdr durchführen, wenn caddar usw. nicht existierte, die erweiterten Funktionen machen Ihnen einfach das Leben ein bisschen einfacher.

Also, der Weg, dies zu erreichen, ist Ihre eigenen cadddar mit car und cdr zu synthetisieren. Wenn es nicht sofort ersichtlich ist, wie dies zu tun ist, starten Sie einfacher (mit, sagen wir cadr oder cdar) und bauen Sie bis cadddar.

1
(first (last (first '(((1 2) 3 4 5) ((6 7) 8 9 10))))) 

-> 5 
1

Die Funktionen mit mehr als 4 a s und d s werden durch den Standard nicht definiert ist, vielleicht, weil gibt es 32 von ihnen [und es wird von da an exponentiell unordentlicher].

Ein sicherer Weg, das letzte Element einer Liste zu erhalten: last die letzte cons Zelle zurückkehrt, so

(car (last list)) 

gibt Ihnen die letzte Listenelement. Natürlich könnte list etwas anderes wie (first list) sein.