Also versuche ich zu sehen, wie Funktionen, die eine beliebige Anzahl von Argumenten akzeptieren können, funktionieren?Optionale Argumente und Punkte im Schema
ich versucht, dieses
(define (plus x . xs)
(if
(null? xs) x
(plus (+ x (car xs)) . (cdr xs))))
(plus 1 2 3 4)
Aber wird schien, dass es nicht wirklich cdr xs anwandte, aber vorbei ((2 3 4)) in, wenn ich durch sie im Debugger trat. Also habe ich versucht, diese
(define (plus* x . xs)
(if
(null? xs) x
(let ((h (car xs))
(t (crd xs)))
(plus* (+ x h) . t))))
Denken: „ha, ich möchte Sie in jetzt passieren cdr sehen“, aber ich erhalte eine Fehlermeldung: „Anwendung: schlechte Syntax (. Illegale Nutzung von` ') in: (plus * (+ xh). t) "
Was ist los?
(ich kann eine Version zusätzlich zur Arbeit kommen, entweder durch
(define (add . xs)
(foldl + 0 xs))
Oder sogar
(define (plus x . xs)
(if
(null? xs) x
(apply plus (cons (+ x (car xs)) (cdr xs)))))
so der Zusatz ist nicht das Problem, wie punktierte Dinge funktionieren ist.)
Was macht es stattdessen? Wie benutzt man den Punkt, wenn nicht so? –
'(x. Y)' wird gelesen als eine Cons-Zelle mit 'x' in seinem' car' und 'y' in seiner cdr - das heißt, es ist keine richtige Liste. Ähnlich ist '(x. (Y))' eine Cons-Zelle mit 'x' in seinem' car' und die Liste '(y)' in seiner 'cdr' - also ist es das selbe wie das Lesen' (xy) '. Wenn Sie also '(plus x. (Cdr t))' 'schreiben, ist das genauso, als hätten Sie' (plus x cdr t) 'geschrieben, was die verwirrenden Ergebnisse erklärt, die Sie erhalten haben. –
Anmerkung BTW, dass Racket ein Syntax-System hat, das es ermöglicht, zwischen den beiden zu unterscheiden und einen Ausdruck, der mit einem solchen '.' eingegeben wurde, anders zu behandeln - aber dies wird nicht gemacht, da dies zu noch größerer Verwirrung führen kann Situationen. –