1

私はスキームの最終試験に向けて勉強していますが、ローカル状態のオブジェクトは常に難しいテーマでした。

これは、私の最終試験の問題で、助けが必要です。

(define (make-incrementer n)
  (let ((old 0)
        (new 0))
    (lambda ()
      (cond ((< new n) 
             (set! old new)
             (set! new (+ new 1))
             old)
            (else 
             (set! old 0)
             (set! new 1)
             old)))))

(define a (make-incrementer 3))
(define b (make-incrementer 3))
(define c a)

; 1) (a)
; 2) (a)

a1 を返す 2 回目に呼び出されるのはなぜですか? 私はコードを見ていますが、n私たちが与えるものは常に 3elseです。

4

2 に答える 2

0

状態をキャプチャするという概念に役立ついくつかの例を次に示します。

(define (always x) 
  (lambda rest x))
(define always-true (always #t))
(always-true #f)
-> #t

(define (add-n n) 
  (lambda (m)
    (+ n m)))
(define add-1 (add-n 1))
(add-1 10)
-> 11

(define (complement predicate)
  (lambda (x)
    (not (predicate x)))
(define not-positive? (complement positive?))
(not-positive? -1)
-> #t

次は、キャプチャされた状態 (この場合lは ) が変更される例です。newこれは、 andoldがキャプチャされて変更された場合に似ています。

(define (nexting l)
  (lambda ()
    (if (null? l)
        '()
        (let ((answer (car l)))
          (set! l (cdr l))
          answer))))
(define next-user (nexting '(Alice Bob David)))
(next-user)
-> Alice
(next-user)
-> Bob
(next-user)
-> David
(next-user)
'()
于 2013-05-14T02:45:57.603 に答える