あなたにとって
クロージャとは?
2009年7月7日 オブラブ2009夏
ファンクション倶楽部 森田秀幸(emeitch)
http://emeitch.com/
2009年7月8日水曜日
緊急アンケート:
クロージャって知ってますか?
1. そんなの聞いたことないよ。
2. 聞いたことぐらいはあるよ。
3. なーんとなくなら知ってるよ。
4. 知ってるよ。便利だよねアレ。
5. 任せて。詳細に説明できるよ。
2009年7月8日水...
おことわり
•今発表はある程度クロージャを知って
いる方向けに構成しています。
•なるべくクロージャを知らない人への
フォローも入れるつもりですが、10分
間しかないので、振り切られたとして
もお許しください。
2009年7月8日水曜日
今回の話のきっかけ
•「檜山正幸のキマイラ飼育記」の7/1
のエントリー「ラムダ式とクロージャ
は同義だ、と主張してみる」のコメン
ト欄での議論がきっかけ。(http://d.hatena.ne.jp/
m-hiyama/20090701/12...
今回の話のきっかけ
•世間で言う「クロージャ」は、ある程
度同じ意味を指しつつも、微妙な違い
がありそうだということが分かった。
•皆さんの認識はどうなんだろう?という
のを聞いてみたくなった。
2009年7月8日水曜日
学術的なクロージャの定義
「一級関数を実装するための
データ構造の一つ」
http://d.hatena.ne.jp/m-hiyama/20090701/1246416600 のsumiiさんのコメントより
2009年7月8日水曜日
学術的なクロージャの定義
•私たちが普段よく使う用法とは明らか
に意味が異なる。(例: 「Hoge言語に
はクロージャが搭載されている。」)
•今回問いたいのは、こういった学術的
定義ではなく、私たち現場プログラマ
がよく使う「クロージャ」の意...
ということで...
皆さんが思う「クロージャ」というのはど
んなものか?というのを聞かせて下さい。
2009年7月8日水曜日
ちなみに
私のクロージャの理解は、学術的定義と
同じで、処理系における一級関数の実装
方式だと思ってた、という方はいます
か?
2009年7月8日水曜日
前提
•学術的な定義をもとにすると、世間的
用法の「クロージャ」は誤りですが、
そこを責める気は毛頭ありません。
•住む世界が違えば、違う意味も生まれ
ますし、間違った用法も、普及してし
まえば正しくなるのが、言葉のルール
です。
2009年7...
前提
•世間一般にちゃんとコンセンサスが取
れた「クロージャ」という用語はない
ので、ある意味それぞれの思い受かべ
る「クロージャ」はすべて正しい。
•なので、「間違っているかも」という
のを恐れず、自分が思う素直なご意見
を聞かせてください。...
(1)第一級関数
[ JavaScript ]
js> var f = function() {
return 3;
}
js> f()
3
ポイントは、匿名のオブジェクト生成や変数への代入が可能なこと。
2009年7月8日水曜日
(2)レキシカルスコープ
[ JavaScript ]
js> var makeAdder = function(a){
return function(b) {
return a + b;
}
}
js> var a = 3
js> var ...
[ JavaScript ]
js> var makeAdder = function(a){
return function(b) {
return a + b;
}
}
js> var adder4 = makeAdder(4)
js> a...
[ JavaScript ]
js> var makeAdder = function(a){
return function(b) {
return a + b;
}
}
js> var adder4 = makeAdder(4)
js> a...
[ JavaScript ]
js> var makeAdder = function(a){
return function(b) {
return a + b;
}
}
js> var adder4 = makeAdder(4)
js> a...
[ JavaScript ]
js> var makeAdder = function(a){
return function(b) {
return a + b;
}
}
js> var adder4 = makeAdder(4)
js> a...
[ JavaScript ]
js> var makeAdder = function(a){
return function(b) {
return a + b;
}
}
js> var adder4 = makeAdder(4)
js> a...
[ JavaScript ]
js> var makeAdder = function(a){
return function(b) {
return a + b;
}
}
js> var adder4 = makeAdder(4)
js> a...
[ JavaScript ]
js> var makeAdder = function(a){
return function(b) {
return a + b;
}
}
js> var adder4 = makeAdder(4)
js> a...
[ JavaScript ]
js> var makeAdder = function(a){
return function(b) {
return a + b;
}
}
js> var adder4 = makeAdder(4)
js> a...
[ JavaScript ]
js> var makeAdder = function(a){
return function(b) {
return a + b;
}
}
js> var adder4 = makeAdder(4)
js> a...
(4)環境に対する副作用
[ JavaScript ]
js> var makeAccum = function(a){
return function(b) {
a += b;
return a;
}
}
js> var accum = ma...
(4)環境に対する副作用
[ JavaScript ]
js> var makeAccum = function(a){
return function(b) {
a += b;
return a;
}
}
js> var accum = ma...
(4)環境に対する副作用
[ JavaScript ]
js> var makeAccum = function(a){
return function(b) {
a += b;
return a;
}
}
js> var accum = ma...
(4)環境に対する副作用
[ JavaScript ]
js> var makeAccum = function(a){
return function(b) {
a += b;
return a;
}
}
js> var accum = ma...
(4)環境に対する副作用
[ JavaScript ]
js> var makeAccum = function(a){
return function(b) {
a += b;
return a;
}
}
js> var accum = ma...
(4)環境に対する副作用
[ JavaScript ]
js> var makeAccum = function(a){
return function(b) {
a += b;
return a;
}
}
js> var accum = ma...
(4)環境に対する副作用
[ JavaScript ]
js> var makeAccum = function(a){
return function(b) {
a += b;
return a;
}
}
js> var accum = ma...
(4)環境に対する副作用
[ JavaScript ]
js> var makeAccum = function(a){
return function(b) {
a += b;
return a;
}
}
js> var accum = ma...
私の主張
世間的用法としては、(1)∼(4)まで全て
の性質を含めて「クロージャ」と呼ぶべ
き。
2009年7月8日水曜日
私の主張
•(1)第1級関数や(2)レキシカルスコープが
無いとクロージャと呼べる気がしない。
•しかし、それらだけでは「クロージャ」は
成立しない。もし、それらしか特性が無い
なら、第1級関数やレキシカルスコープの
関数と呼べばよく、わざわざ...
私の主張
•(3)環境を閉じ込めるは(4)の副作用が
無いなら、実はわざわざ作る必要が無
い。なぜなら値をコピーすれば実現で
きてしまうから。
•よって、副作用がなければ環境は必要
ないし、環境がなければ、やはりク
ロージャと呼ぶ必然性がない。...
まとめ
• 世間一般に言う「クロージャ」という概
念にはいろんな意味が込められている。
• 環境に副作用を与えることができる、レ
キシカルスコープの第1級関数の事を
「クロージャ」と呼んでみない?
2009年7月8日水曜日
ご清聴ありがとう
ございました。
2009年7月8日水曜日
Upcoming SlideShare
Loading in...5
×

あなたにとってのクロージャとは?

980

Published on

Published in: Technology, Education, Sports
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
980
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "あなたにとってのクロージャとは?"

  1. 1. あなたにとって クロージャとは? 2009年7月7日 オブラブ2009夏 ファンクション倶楽部 森田秀幸(emeitch) http://emeitch.com/ 2009年7月8日水曜日
  2. 2. 緊急アンケート: クロージャって知ってますか? 1. そんなの聞いたことないよ。 2. 聞いたことぐらいはあるよ。 3. なーんとなくなら知ってるよ。 4. 知ってるよ。便利だよねアレ。 5. 任せて。詳細に説明できるよ。 2009年7月8日水曜日
  3. 3. おことわり •今発表はある程度クロージャを知って いる方向けに構成しています。 •なるべくクロージャを知らない人への フォローも入れるつもりですが、10分 間しかないので、振り切られたとして もお許しください。 2009年7月8日水曜日
  4. 4. 今回の話のきっかけ •「檜山正幸のキマイラ飼育記」の7/1 のエントリー「ラムダ式とクロージャ は同義だ、と主張してみる」のコメン ト欄での議論がきっかけ。(http://d.hatena.ne.jp/ m-hiyama/20090701/1246416600) •その中での「クロージャとは何か」と いう議論がおもしろかった。 2009年7月8日水曜日
  5. 5. 今回の話のきっかけ •世間で言う「クロージャ」は、ある程 度同じ意味を指しつつも、微妙な違い がありそうだということが分かった。 •皆さんの認識はどうなんだろう?という のを聞いてみたくなった。 2009年7月8日水曜日
  6. 6. 学術的なクロージャの定義 「一級関数を実装するための データ構造の一つ」 http://d.hatena.ne.jp/m-hiyama/20090701/1246416600 のsumiiさんのコメントより 2009年7月8日水曜日
  7. 7. 学術的なクロージャの定義 •私たちが普段よく使う用法とは明らか に意味が異なる。(例: 「Hoge言語に はクロージャが搭載されている。」) •今回問いたいのは、こういった学術的 定義ではなく、私たち現場プログラマ がよく使う「クロージャ」の意味につ いてコンセンサスが取りたい。 2009年7月8日水曜日
  8. 8. ということで... 皆さんが思う「クロージャ」というのはど んなものか?というのを聞かせて下さい。 2009年7月8日水曜日
  9. 9. ちなみに 私のクロージャの理解は、学術的定義と 同じで、処理系における一級関数の実装 方式だと思ってた、という方はいます か? 2009年7月8日水曜日
  10. 10. 前提 •学術的な定義をもとにすると、世間的 用法の「クロージャ」は誤りですが、 そこを責める気は毛頭ありません。 •住む世界が違えば、違う意味も生まれ ますし、間違った用法も、普及してし まえば正しくなるのが、言葉のルール です。 2009年7月8日水曜日
  11. 11. 前提 •世間一般にちゃんとコンセンサスが取 れた「クロージャ」という用語はない ので、ある意味それぞれの思い受かべ る「クロージャ」はすべて正しい。 •なので、「間違っているかも」という のを恐れず、自分が思う素直なご意見 を聞かせてください。 2009年7月8日水曜日
  12. 12. (1)第一級関数 [ JavaScript ] js> var f = function() { return 3; } js> f() 3 ポイントは、匿名のオブジェクト生成や変数への代入が可能なこと。 2009年7月8日水曜日
  13. 13. (2)レキシカルスコープ [ JavaScript ] js> var makeAdder = function(a){ return function(b) { return a + b; } } js> var a = 3 js> var adder4 = makeAdder(4) js> adder4(2) 6 ポイントは、「a + b」の「a」は「var a = 3」の「a」ではな く、functionの引数「a」を参照していること。 2009年7月8日水曜日
  14. 14. [ JavaScript ] js> var makeAdder = function(a){ return function(b) { return a + b; } } js> var adder4 = makeAdder(4) js> adder4(2) 6 js> var adder7 = makeAdder(7) js> adder7(2) 9 (3)環境を閉じこめる ポイントは、adder4とadder7は互いに別の環境を生成し、function に閉じ込めていること。 2009年7月8日水曜日
  15. 15. [ JavaScript ] js> var makeAdder = function(a){ return function(b) { return a + b; } } js> var adder4 = makeAdder(4) js> adder4(2) 6 js> var adder7 = makeAdder(7) js> adder7(2) 9 (3)環境を閉じこめる ポイントは、adder4とadder7は互いに別の環境を生成し、function に閉じ込めていること。 「a = 4」という 環境を生成 2009年7月8日水曜日
  16. 16. [ JavaScript ] js> var makeAdder = function(a){ return function(b) { return a + b; } } js> var adder4 = makeAdder(4) js> adder4(2) 6 js> var adder7 = makeAdder(7) js> adder7(2) 9 (3)環境を閉じこめる ポイントは、adder4とadder7は互いに別の環境を生成し、function に閉じ込めていること。 「a = 4」という 環境を生成 「a = 4」という 環境とfunctionが 結びつく 2009年7月8日水曜日
  17. 17. [ JavaScript ] js> var makeAdder = function(a){ return function(b) { return a + b; } } js> var adder4 = makeAdder(4) js> adder4(2) 6 js> var adder7 = makeAdder(7) js> adder7(2) 9 (3)環境を閉じこめる ポイントは、adder4とadder7は互いに別の環境を生成し、function に閉じ込めていること。 「a = 4」という 環境を生成 「a = 4」という 環境とfunctionが 結びつく 「a = 4」「b=2」とし て「a + b」を実行 2009年7月8日水曜日
  18. 18. [ JavaScript ] js> var makeAdder = function(a){ return function(b) { return a + b; } } js> var adder4 = makeAdder(4) js> adder4(2) 6 js> var adder7 = makeAdder(7) js> adder7(2) 9 (3)環境を閉じこめる ポイントは、adder4とadder7は互いに別の環境を生成し、function に閉じ込めていること。 2009年7月8日水曜日
  19. 19. [ JavaScript ] js> var makeAdder = function(a){ return function(b) { return a + b; } } js> var adder4 = makeAdder(4) js> adder4(2) 6 js> var adder7 = makeAdder(7) js> adder7(2) 9 (3)環境を閉じこめる ポイントは、adder4とadder7は互いに別の環境を生成し、function に閉じ込めていること。 「a = 7」という 環境を生成 2009年7月8日水曜日
  20. 20. [ JavaScript ] js> var makeAdder = function(a){ return function(b) { return a + b; } } js> var adder4 = makeAdder(4) js> adder4(2) 6 js> var adder7 = makeAdder(7) js> adder7(2) 9 (3)環境を閉じこめる ポイントは、adder4とadder7は互いに別の環境を生成し、function に閉じ込めていること。 「a = 7」という 環境とfunctionが 結びつく 「a = 7」という 環境を生成 2009年7月8日水曜日
  21. 21. [ JavaScript ] js> var makeAdder = function(a){ return function(b) { return a + b; } } js> var adder4 = makeAdder(4) js> adder4(2) 6 js> var adder7 = makeAdder(7) js> adder7(2) 9 (3)環境を閉じこめる ポイントは、adder4とadder7は互いに別の環境を生成し、function に閉じ込めていること。 「a = 7」という 環境とfunctionが 結びつく 「a = 7」という 環境を生成 「a = 7」「b = 2」とし て「a + b」を実行 2009年7月8日水曜日
  22. 22. [ JavaScript ] js> var makeAdder = function(a){ return function(b) { return a + b; } } js> var adder4 = makeAdder(4) js> adder4(2) 6 js> var adder7 = makeAdder(7) js> adder7(2) 9 「a = 7」という 環境を生成 (3)環境を閉じこめる ポイントは、adder4とadder7は互いに別の環境を生成し、function に閉じ込めていること。 「a = 4」という 環境を生成 2009年7月8日水曜日
  23. 23. (4)環境に対する副作用 [ JavaScript ] js> var makeAccum = function(a){ return function(b) { a += b; return a; } } js> var accum = makeAccum(4) js> accum(2) 6 js> accum(3) 9 ポイントは、accumを呼び出す度にaの値が変更されていること。 2009年7月8日水曜日
  24. 24. (4)環境に対する副作用 [ JavaScript ] js> var makeAccum = function(a){ return function(b) { a += b; return a; } } js> var accum = makeAccum(4) js> accum(2) 6 js> accum(3) 9 ポイントは、accumを呼び出す度にaの値が変更されていること。 「a = 4」という 環境を生成 2009年7月8日水曜日
  25. 25. (4)環境に対する副作用 [ JavaScript ] js> var makeAccum = function(a){ return function(b) { a += b; return a; } } js> var accum = makeAccum(4) js> accum(2) 6 js> accum(3) 9 ポイントは、accumを呼び出す度にaの値が変更されていること。 2009年7月8日水曜日
  26. 26. (4)環境に対する副作用 [ JavaScript ] js> var makeAccum = function(a){ return function(b) { a += b; return a; } } js> var accum = makeAccum(4) js> accum(2) 6 js> accum(3) 9 ポイントは、accumを呼び出す度にaの値が変更されていること。 function実行 2009年7月8日水曜日
  27. 27. (4)環境に対する副作用 [ JavaScript ] js> var makeAccum = function(a){ return function(b) { a += b; return a; } } js> var accum = makeAccum(4) js> accum(2) 6 js> accum(3) 9 ポイントは、accumを呼び出す度にaの値が変更されていること。 function実行 a(=4)にb(=2)を累算 させて、aを返す。 2009年7月8日水曜日
  28. 28. (4)環境に対する副作用 [ JavaScript ] js> var makeAccum = function(a){ return function(b) { a += b; return a; } } js> var accum = makeAccum(4) js> accum(2) 6 js> accum(3) 9 ポイントは、accumを呼び出す度にaの値が変更されていること。 2009年7月8日水曜日
  29. 29. (4)環境に対する副作用 [ JavaScript ] js> var makeAccum = function(a){ return function(b) { a += b; return a; } } js> var accum = makeAccum(4) js> accum(2) 6 js> accum(3) 9 ポイントは、accumを呼び出す度にaの値が変更されていること。 function実行 2009年7月8日水曜日
  30. 30. (4)環境に対する副作用 [ JavaScript ] js> var makeAccum = function(a){ return function(b) { a += b; return a; } } js> var accum = makeAccum(4) js> accum(2) 6 js> accum(3) 9 ポイントは、accumを呼び出す度にaの値が変更されていること。 function実行 a(=6)にb(=2)を累算 させて、aを返す。 2009年7月8日水曜日
  31. 31. 私の主張 世間的用法としては、(1)∼(4)まで全て の性質を含めて「クロージャ」と呼ぶべ き。 2009年7月8日水曜日
  32. 32. 私の主張 •(1)第1級関数や(2)レキシカルスコープが 無いとクロージャと呼べる気がしない。 •しかし、それらだけでは「クロージャ」は 成立しない。もし、それらしか特性が無い なら、第1級関数やレキシカルスコープの 関数と呼べばよく、わざわざ「クロー ジャ」と呼ぶ必要性を見出せない。 2009年7月8日水曜日
  33. 33. 私の主張 •(3)環境を閉じ込めるは(4)の副作用が 無いなら、実はわざわざ作る必要が無 い。なぜなら値をコピーすれば実現で きてしまうから。 •よって、副作用がなければ環境は必要 ないし、環境がなければ、やはりク ロージャと呼ぶ必然性がない。 2009年7月8日水曜日
  34. 34. まとめ • 世間一般に言う「クロージャ」という概 念にはいろんな意味が込められている。 • 環境に副作用を与えることができる、レ キシカルスコープの第1級関数の事を 「クロージャ」と呼んでみない? 2009年7月8日水曜日
  35. 35. ご清聴ありがとう ございました。 2009年7月8日水曜日
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×