カプセル化とクロージャの違いは何ですか?

ゾク

カプセル化とクロージャーについて、私が本当に理解していないことがあります。カプセル化は、コードで変更しないと変更できないものだと思います。しかし、クロージャーとカプセル化がコードにどのように適用されるかを説明するように求められたとき、私は本当に理解できません。

例えば ​​:

(define new-cercle #f)

(let ((n 0))
 (set! new-cercle
  (lambda (rayon)
    (begin
      (set! n (+ n 1))
        (lambda (msg)
           (cond ((eq? msg ’circonference)
                  (* 2 3.14 rayon))
                 ((eq? msg ’surface)
                  (* 3.14 rayon rayon))
                 ((eq? msg ’nb-cercles)
                  n)))))))

n、右カプセル化されていますか?したがって、問題は、カプセル化とクロージャがこのコードにどのように適用されるかを説明することです。

私が理解していないもう一つのことは、なぜletここでラムダの上になければならないのですか?下に置くとlambda、関数がうまく機能せず、アキュムレータがないのはなぜですか?

(define acc
  (let ((n 1))
    (lambda (x)
      (set! n (* n x))
      n)))

私がグーグルで検索したとき、正直なところ、ほとんどのトピックにある複雑な例では何も理解できなかったので、誰かがこれを簡単な方法で説明してくれることを願っています。

hkBst

些細なケースでは、いくつかの違いがなくなるため、おそらく問題が発生しています。たとえば、両方(let ((n 1)) (lambda (x) n))(lambda (x) (let ((n 1)) n)基本的に同じ機能提供します。

あなたの例では

(define acc (let ((n 1))
              (lambda (x) (set! n (* n x)) n)))

順序letとはlambda重要です。それらを交換すると(lambda (x) (let ((n 1)) ...、呼び出すたびにこの関数nは再びにバインドされ1ます。代わりにn、値で始まり1、関数によって変更でき、関数が完了しても消えない場所があるようにします(let ((n 1)) (lambda (x) (set! n ...これは、を持っているときに得られるものです

インナーによって構築された機能lambdaは、アウターの使用をキャプチャし、nそれ自体が存続する限り、その場所を保持します。またn、この関数以外は参照できないため、カプセル化されます。また、関数はの周囲のバインディングによって閉じられn、関数は(のnクロージャであるとも言います。

字句スコープについて読むことも役立つかもしれません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

オープンとクローズのシャドウDOMカプセル化モードの違いは何ですか?

分類Dev

関数とクロージャの違いは何ですか?

分類Dev

抽象化とカプセル化の違いは何ですか?

分類Dev

抽象化とカプセル化の違いは何ですか?

分類Dev

情報隠蔽とカプセル化の違いは何ですか?

分類Dev

情報隠蔽とカプセル化の違いは何ですか?

分類Dev

JavaScriptのクロージャとプロトタイピングの違いは何ですか?

分類Dev

Oracleの「プロシージャ名IS」と「プロシージャ名AS」の違いは何ですか?

分類Dev

2つのクロージャの違いは何ですか?

分類Dev

このJavaScriptクロージャの違いは何ですか?

分類Dev

(SICP)関数とプロシージャの違いは何ですか?

分類Dev

JavaScriptクロージャーとPHPクロージャーの違いは何ですか?

分類Dev

「クロージャ」と「ラムダ」の違いは何ですか?

分類Dev

「クロージャ」と「ラムダ」の違いは何ですか?

分類Dev

「クロージャ」と「ラムダ」の違いは何ですか?

分類Dev

クロージャに関してforとforeachの違いは何ですか

分類Dev

RustクロージャとHaskellラムダの違いは何ですか?

分類Dev

ジョブとプロセスの違いは何ですか?

分類Dev

OSGIアーキテクチャとMavenマルチモジュールプロジェクトの違いは何ですか?

分類Dev

マルチプロセッシングモジュールのThreadPoolとPoolの違いは何ですか?

分類Dev

パイプとサブプロセスモジュールの違いは何ですか?

分類Dev

Swiftの自動クロージャとエスケープクロージャの違いと目的は何ですか?

分類Dev

静的DNSとローカルDNSの違いは何ですか

分類Dev

ルーチンとプロセスの違いは何ですか

分類Dev

IntelliJのSBTプロジェクトとScalaモジュールの違いは何ですか?

分類Dev

マルチコアプロシージャとマルチプロシージャシステムの違いは何ですか?

分類Dev

マルチコアプロシージャとマルチプロシージャシステムの違いは何ですか?

分類Dev

ブロックとループの違いは正確には何ですか?

分類Dev

WebAssembly仕様の「ブロック」と「ループ」の違いは何ですか?

Related 関連記事

  1. 1

    オープンとクローズのシャドウDOMカプセル化モードの違いは何ですか?

  2. 2

    関数とクロージャの違いは何ですか?

  3. 3

    抽象化とカプセル化の違いは何ですか?

  4. 4

    抽象化とカプセル化の違いは何ですか?

  5. 5

    情報隠蔽とカプセル化の違いは何ですか?

  6. 6

    情報隠蔽とカプセル化の違いは何ですか?

  7. 7

    JavaScriptのクロージャとプロトタイピングの違いは何ですか?

  8. 8

    Oracleの「プロシージャ名IS」と「プロシージャ名AS」の違いは何ですか?

  9. 9

    2つのクロージャの違いは何ですか?

  10. 10

    このJavaScriptクロージャの違いは何ですか?

  11. 11

    (SICP)関数とプロシージャの違いは何ですか?

  12. 12

    JavaScriptクロージャーとPHPクロージャーの違いは何ですか?

  13. 13

    「クロージャ」と「ラムダ」の違いは何ですか?

  14. 14

    「クロージャ」と「ラムダ」の違いは何ですか?

  15. 15

    「クロージャ」と「ラムダ」の違いは何ですか?

  16. 16

    クロージャに関してforとforeachの違いは何ですか

  17. 17

    RustクロージャとHaskellラムダの違いは何ですか?

  18. 18

    ジョブとプロセスの違いは何ですか?

  19. 19

    OSGIアーキテクチャとMavenマルチモジュールプロジェクトの違いは何ですか?

  20. 20

    マルチプロセッシングモジュールのThreadPoolとPoolの違いは何ですか?

  21. 21

    パイプとサブプロセスモジュールの違いは何ですか?

  22. 22

    Swiftの自動クロージャとエスケープクロージャの違いと目的は何ですか?

  23. 23

    静的DNSとローカルDNSの違いは何ですか

  24. 24

    ルーチンとプロセスの違いは何ですか

  25. 25

    IntelliJのSBTプロジェクトとScalaモジュールの違いは何ですか?

  26. 26

    マルチコアプロシージャとマルチプロシージャシステムの違いは何ですか?

  27. 27

    マルチコアプロシージャとマルチプロシージャシステムの違いは何ですか?

  28. 28

    ブロックとループの違いは正確には何ですか?

  29. 29

    WebAssembly仕様の「ブロック」と「ループ」の違いは何ですか?

ホットタグ

アーカイブ