サーチ…
前書き
StackOverflow クロージャタグから:
クロージャは、それが定義されたスコープから変数を参照する(ファーストクラスの)関数です。定義されたスコープが終了した後でもクロージャが存在する場合、クローズされる変数も引き続き存在します。
備考
クロージャとオブジェクトを同様のものと見なすことは時々役に立ちます。
敬虔な師匠Qc Naは、彼の学生Antonと歩いていた。マスターにディスカッションを促すことを願って、アントンは「マスター、オブジェクトがとても良いことを聞いた - 本当ですか? Qc Naは彼の学生をうんざりして見て、「愚かな瞳孔 - 物体は単に貧しい人の閉鎖に過ぎない」と答えた。訴えられたアントンは、主人から休暇を取って、彼の部屋に戻り、閉鎖を勉強することを意図しました。彼は慎重に "ラムダ:究極の..."一連の論文とその同類を慎重に読んで、クロージャベースのオブジェクトシステムを備えた小さなSchemeインタプリタを実装しました。彼は多くを学び、彼の進歩をマスターに知らせるのを楽しみにしていました。
アントンはQc Naとの次の散歩で、「マスター、私はこの問題を徹底的に研究して、オブジェクトが真に貧しい人の閉鎖であることを理解している」と言って、マスターを感心させようとしました。 Qc Naは、アントンに彼の棒を打つことで答えました。「あなたはいつ学びますか?閉鎖は貧しい人の目的です。その瞬間、アントンは啓発された。
出典: http : //c2.com/cgi/wiki?ClosuresAndObjectsAreEquivalent
静的環境での閉鎖
クロージャは、内部状態を保持するプロシージャです。
クロージャを返すプロシージャを定義する
手続きmake-an-adder
は引数x
を1つとり、その値を閉じる関数を返します。あるいは、別の言い方をすると、 x
は返された関数の字句範囲内にあります。
#lang racket
(define (make-an-adder x)
(lambda (y)
(+ y x)))
使用法
make-an-adder
プロシージャmake-an-adder
コールすると、クロージャであるプロシージャがmake-an-adder
ます。
Welcome to DrRacket, version 6.6 [3m].
Language: racket, with debugging; memory limit: 128 MB.
> (define 3adder (make-an-adder 3))
> (3adder 4)
7
> (define 8adder (make-an-adder 8))
> (8adder 4)
12