2010-11-15 15 views
5

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.)

Antwort

6

Ihre letzte Version ist der korrekte Weg, um eine Liste von Zahlen als Eingaben an plus - Sie müssenzu übergeben 10 um dies zu tun. (Nun, entweder das oder vermeide die ganze Sache, wie du es mit foldl getan hast.) Die Verwendung eines Punktes in der Anwendung tut nicht das, was du denkst - es lässt das Programm anders lesen.

+0

Was macht es stattdessen? Wie benutzt man den Punkt, wenn nicht so? –

+3

'(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. –

+0

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. –

Verwandte Themen