Необязательные аргументы и точки в схеме - PullRequest
6 голосов
/ 15 ноября 2010

Итак, я пытаюсь увидеть, как работают функции, которые могут принимать любое количество аргументов?

Я попробовал это

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

Но похоже, что на самом деле он не применял cdrв хз, но проходя ((2 3 4)), когда я прошел через него в отладчике.Поэтому я попробовал это

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

Думая: «ха, я бы хотел, чтобы вы сейчас передали cdr», но я получаю ошибку: «application: плохой синтаксис (недопустимое использование`. ')in: (plus * (+ xh). t) "

Что происходит?

(Я могу получить версию дополнения к работе, либо

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

Или даже

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

Итак, сложение не проблема, как работает пунктир.)

1 Ответ

7 голосов
/ 15 ноября 2010

Ваша последняя версия является правильным способом передачи списка чисел в качестве входных данных для plus - вы должны использовать apply для этого.(Что ж, либо этого, либо избегайте всего этого, как вы делали с foldl.) Использование точки в приложении - это не то, что вы думаете, а то, что программа читает по-другому.

...