2010-11-15 12 views
5

Quindi, sto provando a vedere come funzionano le funzioni che possono accettare un numero qualsiasi di argomenti?Argomenti e punti facoltativi nello schema

Ho provato questo

(define (plus x . xs) 
    (if 
    (null? xs) x 
    (plus (+ x (car xs)) . (cdr xs)))) 
(plus 1 2 3 4) 

Ma è sembrato che non era effettivamente applicando CDR xs, ma passando ((2 3 4)) quando ho intensificato attraverso nel debugger. Così ho provato questo

(define (plus* x . xs) 
    (if 
    (null? xs) x 
    (let ((h (car xs)) 
     (t (crd xs)))    
    (plus* (+ x h) . t)))) 

Thinking: "ah, io vorrei vedere si passa cdr in ora", ma ottengo un errore: "applicazione: bad sintassi (. Uso illegale del` ') in: (più * (+ xh). t) "

Cosa sta succedendo?

(posso ottenere una versione di Oltre al lavoro, sia per

(define (add . xs) 
    (foldl + 0 xs)) 

O anche

(define (plus x . xs) 
    (if 
    (null? xs) x 
    (apply plus (cons (+ x (car xs)) (cdr xs))))) 

modo, l'aggiunta non è il problema, come tratteggiata cose funzionano è.)

risposta

6

L'ultima versione è il modo corretto per passare un elenco di numeri come input a plus - è deve utilizzare apply per farlo. (Bene, o quello, o evitate il tutto come avete fatto con foldl.) L'uso di un punto nell'applicazione non fa ciò che pensate che dovrebbe: rende il programma letto in modo diverso.

+0

Cosa fa invece? Come si usa il punto, se non così? –

+3

'(x. Y)' viene letto come una cella contro con 'x' nel suo' car' e 'y' nel suo cdr - cioè, non è un elenco corretto. Allo stesso modo, '(x. (Y))' è una cella contro con 'x' nella sua' car', e la lista '(y)' nel suo 'cdr' - quindi è come leggere' (xy) '. Quindi quando scrivi '(più x. (Cdr t))', è come se tu scrivessi '(plus x cdr t)', il che spiega i risultati confusi che hai ottenuto. –

+0

Nota BTW che Racket ha un sistema di sintassi che rende possibile distinguere tra i due e trattare un'espressione che è stata inserita con un simile "." In modo diverso - ma ciò non viene fatto poiché può portare a una confusione ancora maggiore negli altri situazioni. –

Problemi correlati