2010-11-15 23 views
5

Tak więc, próbuję zobaczyć, jak działają funkcje, które mogą przyjmować dowolną liczbę argumentów?Opcjonalne argumenty i kropki w schemacie

Próbowałem to

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

Ale wydawało się, że nie została właściwie stosowania CDR do xs, ale przechodząc ((2 3 4)) w kiedy przeszedł przez nią w debugger. Więc próbowałem to

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

myśląc: „ha, chciałbym zobaczyć zdać CDR w teraz”, ale pojawia się błąd: „aplikacji: zła składnia (. Nielegalne użycie` '), w: (plus * (+ xh). t) "

Co się dzieje?

(mogę uzyskać wersję dodatku do pracy, albo przez

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

Albo nawet

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

tak, dodatek nie jest problemem, jak przerywana praca rzeczy jest.)

Odpowiedz

6

Twoja ostatnia wersja to poprawny sposób przekazania listy numerów jako danych wejściowych do plus - musisz musi użyć apply, aby to zrobić. (Cóż, albo to, albo unikaj wszystkiego tak, jak robiłeś to z foldl.) Używanie kropki w aplikacji nie robi tego, co twoim zdaniem powinno - sprawia, że ​​program czyta się inaczej.

+0

Co robi zamiast tego? Jak używać kropki, jeśli nie tak? –

+3

'(x. Y)' jest odczytywane jako komórka cons z 'x' w swoim' car' i 'y' w swoim cdr - to znaczy, że nie jest właściwą listą. Podobnie, '(x. (Y))' jest komórką cons z 'x' w swoim' samochodzie' i listą '(y)' w swoim 'cdr' - więc jest to to samo co czytanie' (xy) '. Więc kiedy napiszesz '(plus x. (Cdr t))', to jest tak samo, jakby napisałeś '(plus x cdr t)', co wyjaśnia mylące wyniki. –

+0

Uwaga BTW, że Rakieta ma system składniowy, który umożliwia rozróżnienie między tymi dwoma i traktuje wyrażenie, które zostało wprowadzone z takim '. Inaczej, ale nie jest to zrobione, ponieważ może to prowadzić do jeszcze większego zamieszania w innych sytuacje. –