2015-10-20 3 views
0

Допустим, у меня есть следующий замыкание в схеме, что увеличивает счетчик каждый раз это называется:Схема - переменная доступа к закрытию

(define count 
    (let ((next 0)) 
    (lambda() 
     (set! next (+ next 1)) 
     next))) 

Мой вопрос просто, как я могу переписать эту функцию, так что я могу получить доступ к значению next без увеличения счетчика? Я пробовал играть с лямбдами, но я просто не могу понять это.

Edit: некоторые контекст:

(define (dispatch m) 
    (let ((count 0)) 
     (cond ((eq? m 'withdraw) withdraw) ; Increments count 
       ((eq? m 'deposit) deposit) ; Increments count 
       ((eq? m 'balance) balance-return) 
       ((eq? m 'transaction) count) ; "count" on this line should return the value 
       (else (error "Unknown request -- MAKE-ACCOUNT" 
          m))))) 
+0

Не могли бы вы привести пример кода, который использует значение 'next'? –

+0

Добавлено на главный вопрос. – nbduckman

+2

В примере, который вы указали, внутренний 'count' всегда будет возвращен (0 в этом случае), поскольку вы привязываете его с let. Вы должны изменить определение 'count' внутри функции' dispatch'. Я полагаю, что это то, что вы сделаете, но я не уверен –

ответ

3

Это не совсем понятно, каким образом count связан с примером банковского счета, однако как-то просто, как

(define (make-account) 
    (let ((count 0)) ; Define `count` here... 
     (define (dispatch m) ; ...and define `dispatch` such that `count` is in scope 
      (cond ((eq? m 'next) ; On message 'next... 
        (lambda() (set! count (+ count 1)))) ; ...return the lambda, which has `count` in its scope 
        ((eq? m 'count) ; On message 'count... 
        count) ; ...return the current count 
        (else ; Otherwise... 
        (error "Unknown request -- MAKE-ACCOUNT" m)))) ...raise error 
     dispatch)) ; Return `dispatch` from `make-account` 

может быть то, что вы ищете для.

Основные идеи являются:

  1. создать область, в которой переменная может жить (здесь: объем make-account процедуры)
  2. Создайте переменную в этой области видимости (здесь: (let ((count 0)))
  3. Просто введите его в область (здесь: установка или получение count)
  4. , который имеет переменную в области (здесь: dispatch).

Вы можете (define acc-dispatch (make-account)), а затем получить текущее значение счетчика с помощью (acc-dispatch 'count), но вы могли бы еще увеличить его, если вы хотите, используя ((acc-dispatch 'next)).

Обратите внимание, что последний применяет лямбда возвращается по телефону (acc-dispatch 'next).

+0

Спасибо, проблема была в том, где мой '(let ((count 0))' был, это было в неправильной области. определение функции достигло результатов, которые я хотел. Спасибо :) – nbduckman

Смежные вопросы