создать ракетку аккумулятора "переменная" - PullRequest
1 голос
/ 09 марта 2012

У меня действительно есть проблемы с пониманием, как я могу создать переменную, которая будет действовать как аккумулятор в ракетке. Это определенно действительно глупый вопрос .... но мне очень трудно читать документацию по ракетке.

Я знаю, что буду использовать какое-то определение или оператор let.

Я хочу иметь возможность передавать число в переменную или функцию, и оно добавляет текущее значение с новым значением, сохраняет сумму ... Как бы я это сделал .... ?? Спасибо ..

(define (accumulator newvalue) "current=current+newvalue" 

как то так ..

Ответы [ 3 ]

4 голосов
/ 09 марта 2012

Аккумулятор, как правило, просто функциональный параметр.В разделе «Как разработать программы» ( онлайн, здесь и далее ) есть несколько глав, посвященных аккумуляторам.Вы их прочитали?

Например, функция reverse реализована с использованием аккумулятора, который запоминает префикс списка, обратный:

;; reverse : list -> list
(define (reverse elems0)
  ;; reverse/accum : list list -> list
  (define (reverse/accum elems reversed-prefix)
    (cond [(null? elems)
           reversed-prefix]
          [else
           (reverse/accum (cdr elems)
                          (cons (car elems) reversed-prefix))]))
  (reverse/accum elems null))

Обратите внимание, что область действия аккумулятораreversed-prefix ограничено функцией.Он обновляется путем вызова функции с новым значением для этого параметра.Разные вызовы reverse имеют разные аккумуляторы, и reverse ничего не помнит от одного вызова к следующему.

Возможно, вы имеете в виду переменную состояния .В этом случае вы define (или связываете его с let или lambda) в соответствующей области действия и обновляете с помощью set!.Вот глобальная переменная состояния:

;; total : number
(define total 0)

;; add-to-total! : number -> number
(define (add-to-total! n)
  (set! total (+ total n))
  total)

(add-to-total! 5) ;; => 5
(add-to-total! 31) ;; => 36

Вот вариант, который создает локальные переменные состояния, поэтому вы можете иметь несколько счетчиков:

;; make-counter : -> number -> number
(define (make-counter)
  (let ([total 0])
    (lambda (n)
      (set! total (+ total n))
      total)))

(define counterA (make-counter))
(define counterB (make-counter))

(counterA 5) ;; => 5
(counterB 10) ;; => 10
(counterA 15) ;; => 20
(counterB 20) ;; => 30

Но не вызывайте аккумуляторы переменных состояния;это смущает людей.

1 голос
/ 09 марта 2012

Вы имеете в виду что-то подобное?

(define (accumulator current newvalue)
  (let ((current (+ current newvalue)))
    ...)
0 голосов
/ 09 марта 2012

Вы можете закрыть переменную аккумулятора:

(define accumulate
  (let ((acc 0))
    (λ (new-val)
      (set! acc (+ acc new-val))
      acc)))

(accumulate 10) ;=> 10
(accumulate 4)  ;=> 14
...