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.)
Co robi zamiast tego? Jak używać kropki, jeśli nie tak? –
'(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. –
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. –