Ich spiele gerade mit LISP herum. Alles ist in Ordnung, aber ich kann das folgende Problem nicht verstehen.Listenauswertung in LISP (merkwürdiges Verhalten der Nachteile)
habe ich die diese append-Betrieb:
(define (append l1 l2)
(if (eq? l1 null)
l2
(cons (first l1)
(myappend (rest l1) l2))))
ich es wie folgt verwendet werden:
(myappend (cons (cons 1 2) null) '(4 5))
Und das Ergebnis in Racket ist:
'((1 . 2) 4 5)
Aber warum? Meiner Meinung nach sollte es '(1 2 4 5) sein, weil cons eine Liste zurückgibt und myappends zwei Listen anfügt. Kann mir jemand helfen? Was macht LISP?
Sie scheinen einige Nicht-Standard-Funktionen eigentümlich Schläger werden. In Lisp (ANSI Common Lisp) werden Listen mit dem Symbol "nil" beendet. Im Standard-Schema (von dem Racket offensichtlich ein Dialekt ist) werden Listen nicht durch ein Symbol abgeschlossen. Sie werden durch ein leeres Listenobjekt beendet, das '()' geschrieben ist (und das bei Verwendung als Ausdruck zitiert werden muss: ''()'). Im Schema verwenden Sie '(null? X)', um zu testen, ob 'x' die leere Liste ist, nicht' (eq x null) '; Es gibt kein vordefiniertes "null". In Common Lisp ist es '(null x)' oder '(nicht x)' oder '(eq x nil)'. – Kaz