2

Let over Lambda でレキシカル クロージャについて読んだところ、Common Lisp 用に次のコード サンプルが提供されました。

(let ((counter 0))
  (lambda () (incf counter)))

これをRacketで次のように書いてみました:

(let ((counter 0))
  (lambda() (+ counter 1)))

counterエラーが発生するため、REPLで呼び出すと:

counter: undefined;
 cannot reference an identifier before its definition

私が理解している限りでは、let/set と lambda を混在させると、感覚からの入力によって人間の記憶を処理および変更できるのと同じ方法で、他の関数によって処理できる状態を lambda に保存することができます。LISP プログラムに、他の関数との相互作用によって変更されるコードの一部を含めることに興味があります。これがラムダによって行われなくても、Racket やその他の LISP 方言の重要な部分であるように見えるので、それ (ラムダ関数) を理解したいと思っています。

4

2 に答える 2

5

(incf x)(+ x 1)Common Lisp ではRacket と同等ではありませんが、最初にx:(set! x (+ x 1))をインクリメントしてから新しい値を返すという組み合わせです。

したがって、Racket で同様の関数を定義したい場合は、たとえば次のように記述できます。

(define count
  (let ((counter 0))
    (lambda () (begin (set! counter (+ counter 1)) counter))))

(count)    ; returns 1

(count)    ; returns 2
于 2016-04-08T16:01:13.747 に答える
0

scheme/racket では、 Lisp 関数のset!代わりにwhichを使用する必要があります(ちなみに、とは異なり、新しい値を返しません)。incfset!infc

于 2016-04-08T16:00:39.417 に答える