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 è.)
Cosa fa invece? Come si usa il punto, se non così? –
'(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. –
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. –