Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[資料] 静的束縛と動的束縛の違い

zk-phi
July 24, 2019

[資料] 静的束縛と動的束縛の違い

図で理解するとわかりやすい説

zk-phi

July 24, 2019
Tweet

More Decks by zk-phi

Other Decks in Programming

Transcript

  1. 静的束縛と動的束縛の話

  2. 静的束縛と動的束縛の話 ⼤前提 ・スコープはネスト (スタック) する ・原則として、内側のスコープが外側のスコープに優先する

  3. (let ((a 1) (b 2)) (print a)) ;; => 1

    a => 1 b => 2 静的束縛と動的束縛の話 ⼤前提 ・スコープはネスト (スタック) する ・原則として、内側のスコープが外側のスコープに優先する 最新の環境
  4. (let ((a 1) (b 2)) (setq a 100) (print a))

    ;; => 100 a => 100 b => 2 静的束縛と動的束縛の話 ⼤前提 ・スコープはネスト (スタック) する ・原則として、内側のスコープが外側のスコープに優先する 最新の環境
  5. (let ((a 1) (b 2)) (let ((a 2)) (print a)))

    ;; => 2 a => 1 b => 2 a => 2 静的束縛と動的束縛の話 ⼤前提 ・スコープはネスト (スタック) する ・原則として、内側のスコープが外側のスコープに優先する 最新の環境
  6. (let ((a 1) (b 2)) (let ((a 2)) (setq a

    200) (print a))) ;; => 200 a => 1 b => 2 a => 200 静的束縛と動的束縛の話 ⼤前提 ・スコープはネスト (スタック) する ・原則として、内側のスコープが外側のスコープに優先する 最新の環境
  7. (let ((a 1) (b 2)) (let ((a 2)) (setq a

    200) (print a)) (print a)) ;; => 1 a => 1 b => 2 a => 200 静的束縛と動的束縛の話 ⼤前提 ・スコープはネスト (スタック) する ・原則として、内側のスコープが外側のスコープに優先する 最新の環境
  8. 静的束縛と動的束縛の話 ⼤前提 ・スコープはネスト (スタック) する ・原則として、内側のスコープが外側のスコープに優先する ここまではわりと素直 ややこしいのは式がスコープをまたいで実⾏される時

  9. (let ((a 1) (b 2)) (let ((f (λ () (print

    a)))) (f))) ;; => 1 a => 1 b => 2 f => #<fn> 静的束縛と動的束縛の話 ⼤前提 ・スコープはネスト (スタック) する ・原則として、内側のスコープが外側のスコープに優先する 最新の環境
  10. (let ((a 1) (b 2)) (let ((f (λ () (print

    a)))) (let ((a 2)) (f)))) ;; => ?? a => 1 b => 2 f => #<fn> 静的束縛と動的束縛の話 ⼤前提 ・スコープはネスト (スタック) する ・原則として、内側のスコープが外側のスコープに優先する a => 2 当時の環境 最新の環境
  11. 静的束縛と動的束縛の話 ⼤前提 ・スコープはネスト (スタック) する ・原則として、内側のスコープが外側のスコープに優先する ここまではわりと素直 ややこしいのは式がスコープをまたいで実⾏される時 ・静的束縛は「式が書かれた時点での最新の環境」を参照する ・動的束縛はいつも「最新の環境」を参照する

  12. (let ((a 1) (b 2)) (let ((f (λ () (print

    a)))) (let ((a 2)) (f)))) ;; => 静的:1, 動的:2 a => 1 b => 2 f => #<fn> 静的束縛と動的束縛の話 ⼤前提 ・スコープはネスト (スタック) する ・原則として、内側のスコープが外側のスコープに優先する a => 2 当時の環境 最新の環境
  13. 静的束縛と動的束縛の話 ⼤前提 ・スコープはネスト (スタック) する ・原則として、内側のスコープが外側のスコープに優先する ここまではわりと素直 ややこしいのは式がスコープをまたいで実⾏される時 ・静的束縛は「式が書かれた時点での最新の環境」を参照する ・動的束縛はいつも「最新の環境」を参照する

    代⼊がどの環境を書き換えるかも同様
  14. (let ((a 1) (b 2)) (let ((f! (λ () (setq

    a 100)))) (let ((a 2)) (f!))) (print a)) ;; => 静的:100, 動的:1 a => 1 100 b => 2 f => #<fn> 静的束縛と動的束縛の話 ⼤前提 ・スコープはネスト (スタック) する ・原則として、内側のスコープが外側のスコープに優先する 最新の環境 a => 100 2 当時の環境