関数型言語に必ずくっついてるこれ
いらんでしょ?匿名クラスで充分でしょ
探検
クロージャって何がいいの? [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2014/11/08(土) 13:11:47.84ID:6V2MLUHb2014/11/09(日) 20:32:25.05ID:lx9et4kr
Lispっぽくクロージャ書けるよ
f = (lambda x:
(lambda y=2*x:
(lambda z=x*y:
(lambda w: w * (y + z))))()())
g = f(2)
g(3) #=> 36
f = (lambda x:
(lambda y=2*x:
(lambda z=x*y:
(lambda w: w * (y + z))))()())
g = f(2)
g(3) #=> 36
2014/11/09(日) 20:34:00.52ID:KOr7L+hP
>>43
言葉を「変数の再束縛」へ言い換えただけでは、結論は同じだよ
C#、Java8、C++11、JavaScript、Ruby 等々の一般的な言語では関数やラムダ式はクロージャを元に
設計されているから、外の環境を参照した値を「局所変数に再束縛」できる
それが当たり前で、自然な関数型プログラミングができる
それに対して(クロージャを元にしていない)手続き型言語の Python では、
ラムダ式の中だと「局所変数に再束縛」できない
従って、手続き型言語の Python は関数型プログラミングには不向きである
言葉を「変数の再束縛」へ言い換えただけでは、結論は同じだよ
C#、Java8、C++11、JavaScript、Ruby 等々の一般的な言語では関数やラムダ式はクロージャを元に
設計されているから、外の環境を参照した値を「局所変数に再束縛」できる
それが当たり前で、自然な関数型プログラミングができる
それに対して(クロージャを元にしていない)手続き型言語の Python では、
ラムダ式の中だと「局所変数に再束縛」できない
従って、手続き型言語の Python は関数型プログラミングには不向きである
2014/11/09(日) 20:34:54.87ID:nlmXbEn2
>>45
評価はPythonのラムダの中でも出来るよな?
評価はPythonのラムダの中でも出来るよな?
2014/11/09(日) 20:37:14.94ID:nlmXbEn2
2014/11/09(日) 20:40:33.21ID:lx9et4kr
2014/11/09(日) 20:49:43.56ID:lx9et4kr
>>44
そうだよ
そうだよ
2014/11/09(日) 21:05:06.25ID:KOr7L+hP
>>47
クロージャを備えた言語であれば、ラムダ式を入れ子にした複雑なコードを書かなくても、
単純明瞭で可読性の高いコードが書ける
f = function(x) {
y = 2 * x;
z = x * y;
return function(w) { return w * (y + z) }
}
g = f(2);
print(g(3));
これがクロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々の普通の言語と
関数型プログラミングに不向きな手続き型言語 Python との違い
クロージャを備えた言語であれば、ラムダ式を入れ子にした複雑なコードを書かなくても、
単純明瞭で可読性の高いコードが書ける
f = function(x) {
y = 2 * x;
z = x * y;
return function(w) { return w * (y + z) }
}
g = f(2);
print(g(3));
これがクロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々の普通の言語と
関数型プログラミングに不向きな手続き型言語 Python との違い
2014/11/09(日) 21:08:04.55ID:lx9et4kr
ラムダ式の入れ子は分かりにくいから
関数型プログラミングに向いてない
関数型とは一体…
関数型プログラミングに向いてない
関数型とは一体…
2014/11/09(日) 21:09:53.89ID:5LKfT6rZ
そもそも関数型プログラミングって堂々と代入してるようじゃダメなのでは
2014/11/09(日) 21:12:20.49ID:lx9et4kr
どれだけ間違いを指摘しても
Pythonにクロージャが無いって意見を上書きできない
これが参照透過性です
Pythonにクロージャが無いって意見を上書きできない
これが参照透過性です
2014/11/09(日) 21:14:02.40ID:KOr7L+hP
2014/11/09(日) 21:18:46.76ID:KOr7L+hP
>>53
>ラムダ式の入れ子は分かりにくいから
>関数型プログラミングに向いてない
添削しよう:
ラムダ式の入れ子は分かりにくいから、
ラムダ式の入れ子や関数内関数を多用しなければならない手続き型言語の Python は
関数型プログラミングに向いてない
それに対して、クロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々の普通の言語では、
クロージャ自身が持つ局所環境内の変数に代入(=束縛)できるから、
関数型プログラミングに向いている
>ラムダ式の入れ子は分かりにくいから
>関数型プログラミングに向いてない
添削しよう:
ラムダ式の入れ子は分かりにくいから、
ラムダ式の入れ子や関数内関数を多用しなければならない手続き型言語の Python は
関数型プログラミングに向いてない
それに対して、クロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々の普通の言語では、
クロージャ自身が持つ局所環境内の変数に代入(=束縛)できるから、
関数型プログラミングに向いている
2014/11/09(日) 21:25:01.25ID:KOr7L+hP
2014/11/09(日) 21:31:21.14ID:lx9et4kr
変数に再束縛できないから、変数に代入できないに意見が変わったね
やっと>>30に追いついたね
やっと>>30に追いついたね
2014/11/09(日) 21:36:16.07ID:lx9et4kr
>>46の変数は外から見えないという意味で
紛れもなく局所変数
紛れもなく局所変数
2014/11/09(日) 21:41:46.54ID:LUEi6lWE
Java 8にクロージャなんかあったっけ?
ただのラムダだったような
ただのラムダだったような
2014/11/09(日) 21:44:14.34ID:KOr7L+hP
2014/11/09(日) 21:45:18.38ID:lx9et4kr
普通は関数定義するよ
当たり前じゃん
当たり前じゃん
2014/11/09(日) 21:49:19.33ID:lx9et4kr
ところで関数はクロージャじゃないって
どこの文化なの?
聞いたことない
どこの文化なの?
聞いたことない
2014/11/09(日) 21:50:58.85ID:KOr7L+hP
2014/11/09(日) 21:55:24.38ID:lx9et4kr
言語的にはJavaのラムダは
ただのメソッド一つのクラスだよ
ただのメソッド一つのクラスだよ
2014/11/09(日) 21:58:19.30ID:KOr7L+hP
2014/11/09(日) 22:04:34.10ID:lx9et4kr
2014/11/09(日) 22:05:03.57ID:TZMLlS/6
Java 8のクロージャは「effectively finalに限りキャプチャ可能」
というなんちゃってな局所環境だけどな
effectively finalの導入でかろうじて使い物になるかも知れないレベル
というなんちゃってな局所環境だけどな
effectively finalの導入でかろうじて使い物になるかも知れないレベル
2014/11/09(日) 22:10:31.90ID:KOr7L+hP
2014/11/09(日) 22:13:13.99ID:n2NDOrh4
>>38
…Haskellにはクロージャが無いと?
…Haskellにはクロージャが無いと?
2014/11/09(日) 22:21:17.10ID:KOr7L+hP
2014/11/09(日) 22:21:52.15ID:lx9et4kr
>>70
だから普通はこう書くよ
あれ?一番簡潔になった?
def f(x):
y = 2 * x
z = x * y
return lambda w: w * (y + z)
g = f(2)
g(3)
だから普通はこう書くよ
あれ?一番簡潔になった?
def f(x):
y = 2 * x
z = x * y
return lambda w: w * (y + z)
g = f(2)
g(3)
2014/11/09(日) 22:25:17.72ID:lx9et4kr
2014/11/09(日) 22:28:55.78ID:GwhuA7Og
>クロージャを識別子に束縛したものが関数だから
C#やECMAScriptの匿名関数は関数ではないと。
珍妙な新説ですなふむふむ
C#やECMAScriptの匿名関数は関数ではないと。
珍妙な新説ですなふむふむ
2014/11/09(日) 22:31:31.78ID:KOr7L+hP
2014/11/09(日) 22:45:45.31ID:KOr7L+hP
>>73
たとえば JavaScript なら、ラムダ式だけ(>>52)と関数定義との併用、
それらのどちらでも簡潔なコードが書けるよ
function f(x) {
y = 2 * x
z = x * y
return function(w) { return w * (y + z) }
}
g = f(2)
g(3)
結局、Python では「ラムダ式を放棄して」関数定義しなければ簡潔なコードを書けない、
ということが実証されてしまったようだね
つまり、真のクロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々のふつうの言語では、
ラムダ式だけでも関数定義との併用でも、ケースバイケースで選択して簡潔で可読性のあるコードを「書ける」けど、
手続き型言語の Python だとラムダ式だけでは「入れ子になったカッコだらけ」の汚いコード(>>47)しか書けないから、
常に関数定義で「書かなければならない」という違いがある
たとえば JavaScript なら、ラムダ式だけ(>>52)と関数定義との併用、
それらのどちらでも簡潔なコードが書けるよ
function f(x) {
y = 2 * x
z = x * y
return function(w) { return w * (y + z) }
}
g = f(2)
g(3)
結局、Python では「ラムダ式を放棄して」関数定義しなければ簡潔なコードを書けない、
ということが実証されてしまったようだね
つまり、真のクロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々のふつうの言語では、
ラムダ式だけでも関数定義との併用でも、ケースバイケースで選択して簡潔で可読性のあるコードを「書ける」けど、
手続き型言語の Python だとラムダ式だけでは「入れ子になったカッコだらけ」の汚いコード(>>47)しか書けないから、
常に関数定義で「書かなければならない」という違いがある
2014/11/09(日) 22:46:49.16ID:nlmXbEn2
2014/11/09(日) 22:49:23.73ID:5LKfT6rZ
2014/11/09(日) 22:51:44.34ID:lx9et4kr
2014/11/09(日) 22:54:09.40ID:nlmXbEn2
2014/11/09(日) 22:56:01.93ID:5LKfT6rZ
でもまあ、pythonの文法が変態なのは間違いない。
2014/11/09(日) 22:56:21.23ID:KOr7L+hP
2014/11/09(日) 22:59:47.88ID:QKkGL4h0
2014/11/09(日) 23:01:05.93ID:lx9et4kr
2014/11/09(日) 23:08:28.24ID:KOr7L+hP
>>80
>で、なぜ関数定義でクロージャが作れる
>Pythonにクロージャがない事になるの?
>>72 で書いたように、真のクロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々の
ふつうの言語では(関数定義だけではなく)ラムダ式でもクロージャが作られるという違いがあるからだ
対して、Python のラムダ式ではクロージャが作られない(だから、局所変数へ値を代入できない)
もし「Pythonにクロージャがない」という主張が不適切であるのならば、
>>42 の最後で書いたように、
「Python の言語設計者達は、処理系への実装を失敗した、あるいは言語設計上の欠陥を見落とした」
と言い換えてもいいよ
こんな使い物にならないラムダ式で満足しなければならないとは、最大の被害者は Python プログラマだよね
だって、他のふつうの言語であれば「ふつうに書ける」ことが、Python じゃ「書けない」のだから....(>>83)
>で、なぜ関数定義でクロージャが作れる
>Pythonにクロージャがない事になるの?
>>72 で書いたように、真のクロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々の
ふつうの言語では(関数定義だけではなく)ラムダ式でもクロージャが作られるという違いがあるからだ
対して、Python のラムダ式ではクロージャが作られない(だから、局所変数へ値を代入できない)
もし「Pythonにクロージャがない」という主張が不適切であるのならば、
>>42 の最後で書いたように、
「Python の言語設計者達は、処理系への実装を失敗した、あるいは言語設計上の欠陥を見落とした」
と言い換えてもいいよ
こんな使い物にならないラムダ式で満足しなければならないとは、最大の被害者は Python プログラマだよね
だって、他のふつうの言語であれば「ふつうに書ける」ことが、Python じゃ「書けない」のだから....(>>83)
2014/11/09(日) 23:13:26.40ID:5LKfT6rZ
ラムダ式の構文が残念だと言いたいなら、最初からそう言えばいいじゃん。
2014/11/09(日) 23:16:00.89ID:KOr7L+hP
>>84
ラムダ式が引数に値を束縛できるのは、関数型言語を知っていれば常識だよ
そんなことも知らないの?
で、引数以外の局所変数に値を束縛するには、純粋なラムダ式に加えてクロージャが必要になるって話だよ
ラムダ式が引数に値を束縛できるのは、関数型言語を知っていれば常識だよ
そんなことも知らないの?
で、引数以外の局所変数に値を束縛するには、純粋なラムダ式に加えてクロージャが必要になるって話だよ
2014/11/09(日) 23:18:21.66ID:G8K4RNhm
>ラムダ式が引数に値を束縛できるのは
それ束縛じゃねーだろ
キミはアホなのか?
それ束縛じゃねーだろ
キミはアホなのか?
2014/11/09(日) 23:18:59.88ID:nlmXbEn2
2014/11/09(日) 23:23:03.86ID:lx9et4kr
2014/11/09(日) 23:26:01.65ID:lx9et4kr
2014/11/09(日) 23:27:54.79ID:KOr7L+hP
2014/11/09(日) 23:30:45.91ID:nlmXbEn2
2014/11/09(日) 23:33:02.09ID:KOr7L+hP
2014/11/09(日) 23:33:22.37ID:5KptUVSU
使い勝手で一番使い物にならないのはJavaだろ?
void m() {
int y = f();
y = y + 1;
new Thread(
() -> {ここでyを使えないKUSO言語}
);
}
void m() {
int y = f();
y = y + 1;
new Thread(
() -> {ここでyを使えないKUSO言語}
);
}
2014/11/09(日) 23:33:25.09ID:5LKfT6rZ
ID:KOr7L+hP が言ってるのは、
関数の引数にもう少し複雑な処理をインラインで書きたいのに、
defは値返さねえし、lambdaは1行しか書けねえし、
まったく融通がきかねえな!
みたいな字面上の不満であって、関数型プログラミングだのクロージャだの全然関係ない。
関数の引数にもう少し複雑な処理をインラインで書きたいのに、
defは値返さねえし、lambdaは1行しか書けねえし、
まったく融通がきかねえな!
みたいな字面上の不満であって、関数型プログラミングだのクロージャだの全然関係ない。
2014/11/09(日) 23:36:58.94ID:lx9et4kr
2014/11/09(日) 23:39:26.26ID:nlmXbEn2
真のクロージャとかいうオレオレ用語
もちろん引用もなければ定義もない
もちろん引用もなければ定義もない
100デフォルトの名無しさん
2014/11/09(日) 23:40:53.08ID:KOr7L+hP >>94
クロージャという概念を正しく理解していないと、
Python みたいなラムダ式に欠陥のある言語が設計されてしまうというお話だよ
言い換えると、クロージャという概念を用いると、
なぜ Python のラムダ式が欠陥品なのかを明解に説明できる
このクロージャの利点は、このスレの主旨からは逸脱していないと思うよ
クロージャという概念を正しく理解していないと、
Python みたいなラムダ式に欠陥のある言語が設計されてしまうというお話だよ
言い換えると、クロージャという概念を用いると、
なぜ Python のラムダ式が欠陥品なのかを明解に説明できる
このクロージャの利点は、このスレの主旨からは逸脱していないと思うよ
101デフォルトの名無しさん
2014/11/09(日) 23:42:02.22ID:nlmXbEn2102デフォルトの名無しさん
2014/11/09(日) 23:57:43.62ID:KOr7L+hP >>98
No だね
あえていえば「クロージャもどき」とか「なんちゃってクロージャ」だね
真のクロージャであれば無名関数でも間数定義でも作られ、
無名関数であってもクロージャを構成する局所環境を持つことができる
これが、 C#、Java8、C++11、JavaScript、Ruby 等々の
「ふつうの言語」における「ふつうのクロージャ」だ
おそらくクロージャを正しく理解していなかったんだろね、Python 言語設計者達は....
No だね
あえていえば「クロージャもどき」とか「なんちゃってクロージャ」だね
真のクロージャであれば無名関数でも間数定義でも作られ、
無名関数であってもクロージャを構成する局所環境を持つことができる
これが、 C#、Java8、C++11、JavaScript、Ruby 等々の
「ふつうの言語」における「ふつうのクロージャ」だ
おそらくクロージャを正しく理解していなかったんだろね、Python 言語設計者達は....
103デフォルトの名無しさん
2014/11/09(日) 23:59:39.38ID:yjLcynWs 話をまとめよう
世間一般のクロージャの要件:
局所環境を持つ(変数を束縛できる)
関数をインラインで書ける
キチガイのクロージャの要件:
クソージャの中にクソージャが書ける
若しくは
言語設計上の欠陥を見落としたことを認める(>>86の発言)
のいずれか
世間一般のクロージャの要件:
局所環境を持つ(変数を束縛できる)
関数をインラインで書ける
キチガイのクロージャの要件:
クソージャの中にクソージャが書ける
若しくは
言語設計上の欠陥を見落としたことを認める(>>86の発言)
のいずれか
104デフォルトの名無しさん
2014/11/10(月) 00:08:24.74ID:LMH7nFF4105デフォルトの名無しさん
2014/11/10(月) 00:14:31.96ID:cCGgoLPL まあここはscheme最強っていう事にしておきますか。
106デフォルトの名無しさん
2014/11/10(月) 00:28:52.73ID:LMH7nFF4 >>101
> 構文の字面しか見てないし
だとすれば、Martin Fowler氏も「構文の字面しか見てない」ってもとになるんだろな
・Martin Fowler's Bliki in Japanese - クロージャ
http://capsctrl.que.jp/kdmsnr/wiki/bliki/?Closure
Lsip/Smalltalk/Ruby/JavaScript といったプログラミング言語では、
クロージャやブロックを多用したスタイルが好まれる
だから、Python みたいな無名関数で局所環境を持てない言語で同じようにクロージャを
多用するスタイルを試みると、「ラムダ式が入れ子でカッコだらけ(>>46)」な汚いコードや、
いちいち「関数定義しなければならない(>>73)」ケースと頻繁に出会うから、ストレスが溜まる
まあ「Python は手続き型言語」だから仕方ないんだよと自分に言い聞かせて我慢してるけど、
プログラミング言語を自由に選べるなら、真っ先に Python は除外するね、自分なら
もし、これが「構文の字面しか見てない」と思えるのなら、それはそれでもいいんじゃないのかもね.....
> 構文の字面しか見てないし
だとすれば、Martin Fowler氏も「構文の字面しか見てない」ってもとになるんだろな
・Martin Fowler's Bliki in Japanese - クロージャ
http://capsctrl.que.jp/kdmsnr/wiki/bliki/?Closure
Lsip/Smalltalk/Ruby/JavaScript といったプログラミング言語では、
クロージャやブロックを多用したスタイルが好まれる
だから、Python みたいな無名関数で局所環境を持てない言語で同じようにクロージャを
多用するスタイルを試みると、「ラムダ式が入れ子でカッコだらけ(>>46)」な汚いコードや、
いちいち「関数定義しなければならない(>>73)」ケースと頻繁に出会うから、ストレスが溜まる
まあ「Python は手続き型言語」だから仕方ないんだよと自分に言い聞かせて我慢してるけど、
プログラミング言語を自由に選べるなら、真っ先に Python は除外するね、自分なら
もし、これが「構文の字面しか見てない」と思えるのなら、それはそれでもいいんじゃないのかもね.....
107デフォルトの名無しさん
2014/11/10(月) 00:37:52.21ID:cCGgoLPL Pythonはlambdaの不便さも含めて構文がアレなので大嫌いだけど、
ライブラリが色々そろってて便利だから結局よく使っているのであった。
ライブラリが色々そろってて便利だから結局よく使っているのであった。
108デフォルトの名無しさん
2014/11/10(月) 00:42:53.31ID:zIX5GD/A pythonのlambdaってmapやfilterを追加したときに申し訳程度に付けたって感じ
109デフォルトの名無しさん
2014/11/10(月) 02:52:22.03ID:qQmxJFhq >>106
その文章を書いた人の考えと、君の解釈には随分とズレがあるようだ
その文章を書いた人の考えと、君の解釈には随分とズレがあるようだ
110デフォルトの名無しさん
2014/11/10(月) 06:04:53.17ID:i3Y7RgoA 馬鹿には無理
111デフォルトの名無しさん
2014/11/10(月) 07:14:42.95ID:0mRy26rG Pythonの不自由さ(関数型のクロージャに近いの)はGuidoの方針じゃないの?
嫌なら、おとなしくジェネレータ使えばいいじゃん。
嫌なら、おとなしくジェネレータ使えばいいじゃん。
112デフォルトの名無しさん
2014/11/10(月) 08:48:39.72ID:PWSP4TjP クロージャは何がいいんだよ!
https://i.imgur.com/fTQTEYN.gif
https://i.imgur.com/fTQTEYN.gif
113デフォルトの名無しさん
2014/11/10(月) 09:04:03.39ID:HTkQymog 引数に別名付けたくなる程に中身が長いなら
関数にも名前付けろってのがGuidoの方針なんだろ
文法的に拡張可能なのに、あえてリジェクトしてるくらいだし
http://www.artima.com/weblogs/viewpost.jsp?thread=147358
関数にも名前付けろってのがGuidoの方針なんだろ
文法的に拡張可能なのに、あえてリジェクトしてるくらいだし
http://www.artima.com/weblogs/viewpost.jsp?thread=147358
114デフォルトの名無しさん
2014/11/10(月) 10:20:30.55ID:CeTPRNSr1151
2014/11/10(月) 11:39:28.98ID:rdbd3Lyi 何がクロージャかよりどこが好きかでクロージャを語れよ!!(ドンッ
116デフォルトの名無しさん
2014/11/10(月) 20:33:09.35ID:AR7BQCkT クロージャとメソッドで f[x] と f(x) を使い分けなきゃダメなRubyが
一番ウンコだと思う
一番ウンコだと思う
117デフォルトの名無しさん
2014/11/10(月) 20:39:42.07ID:5eyjbk6/118デフォルトの名無しさん
2014/11/10(月) 21:34:09.37ID:Xzn5T3EF119デフォルトの名無しさん
2014/11/10(月) 22:47:25.14ID:oQ75X8QG 文系出身プログラマ「クロージャ?なにそれ?服入れるとこ??」
ってやつに対してドヤ顔ができる
ってやつに対してドヤ顔ができる
120デフォルトの名無しさん
2014/11/11(火) 06:32:45.68ID:G8l0apNf クロー系の最強魔法です 消費MP60
121118
2014/11/11(火) 21:00:28.44ID:UknPa1bY レスお願いします
122デフォルトの名無しさん
2014/11/11(火) 22:06:02.40ID:3gT2I0NB 若い時に買ってでもすることは?
苦労じゃ!くろうじゃ!クロージャ!
苦労じゃ!くろうじゃ!クロージャ!
123デフォルトの名無しさん
2014/11/12(水) 01:25:01.41ID:G1/eYMX4 クロージャの良さを、クロージャを使うことで劇的に
簡潔になる例を使って説明してください
簡潔になる例を使って説明してください
124デフォルトの名無しさん
2014/11/12(水) 07:27:28.43ID:ptlTHlgg コールバック関数を別途書かなくて良くなります。
もしコールバック関数の為だけにインスタンス変数を定義していたなら、
それも必要が無くなります。
消費MP 5
もしコールバック関数の為だけにインスタンス変数を定義していたなら、
それも必要が無くなります。
消費MP 5
125デフォルトの名無しさん
2014/11/12(水) 08:10:30.04ID:G1/eYMX4 コールバック関数地獄のJSのコードは
可読性が悪い上に簡潔でも無いので、失格です
可読性が悪い上に簡潔でも無いので、失格です
126デフォルトの名無しさん
2014/11/12(水) 08:13:15.39ID:/hly7+iy オールバックって額からハゲるだろ?
127デフォルトの名無しさん
2014/11/12(水) 08:27:11.27ID:cKuXIrT/128デフォルトの名無しさん
2014/11/12(水) 20:27:05.24ID:3VJGATlA129デフォルトの名無しさん
2014/11/12(水) 20:37:53.49ID:L8labB6g 見慣れてるかどうかだと思うけどな
130デフォルトの名無しさん
2014/11/12(水) 20:38:24.71ID:5GyhUZuz >>128
代案も出さずに批判だけするなら、幼稚園児にだってできるよ
代案も出さずに批判だけするなら、幼稚園児にだってできるよ
131デフォルトの名無しさん
2014/11/12(水) 20:52:00.80ID:UPi6O5bX リスナーI/Fをインプリメントしたオブジェクト渡せばいいのでは
132デフォルトの名無しさん
2014/11/12(水) 21:14:25.68ID:ptlTHlgg それではそのオブジェクトを定義しなくてはならなくなります。
クロージャはそのようなデリゲートオブジェクトやコールバックパターンからの解放なのです。
消費MP 12
クロージャはそのようなデリゲートオブジェクトやコールバックパターンからの解放なのです。
消費MP 12
133デフォルトの名無しさん
2014/11/12(水) 21:16:45.87ID:eep146vT JavaScript(だけに限らないが)
クロージャーが見難いんじゃなくて
非同期の入れ子が見にくいんだろ。
で、それを解決するライブラリが存在する。
結局のところ、そのライブラリ
Promiseとかを使えば解決する問題。
クロージャーが見難いんじゃなくて
非同期の入れ子が見にくいんだろ。
で、それを解決するライブラリが存在する。
結局のところ、そのライブラリ
Promiseとかを使えば解決する問題。
134デフォルトの名無しさん
2014/11/12(水) 21:23:36.45ID:G1/eYMX4 結局のところ、コールバックはクロージャのメリットじゃないんですね?
もっと良い方法があるのですから
もっと良い方法があるのですから
135デフォルトの名無しさん
2014/11/12(水) 21:36:55.56ID:ptlTHlgg いや、クロージャ使ってそのスコープで解決しちゃえばコールバック関数要らないって話なんだが。
136デフォルトの名無しさん
2014/11/12(水) 21:59:20.14ID:G1/eYMX4 Haskellのdo記法みたいなのがあれば
クロージャをチェインしていっても読み難くならないという話ですか?
クロージャをチェインしていっても読み難くならないという話ですか?
137デフォルトの名無しさん
2014/11/12(水) 22:58:17.02ID:L8labB6g 小規模なコールバックだったらインラインで書いた方が見通しが良いだろうし、
複雑なのだったら分けて書いた方が理解しやすいだろうし、
あれが最強他はゴミとか言ってるのが一番ダメなんじゃね?
複雑なのだったら分けて書いた方が理解しやすいだろうし、
あれが最強他はゴミとか言ってるのが一番ダメなんじゃね?
138デフォルトの名無しさん
2014/11/15(土) 12:17:49.98ID:uUcubJGq 結局クロージャの利点てコールバックが楽にかけるってだけ?
ならクロージャや匿名オブジェクトじゃなくて匿名メソッドが書ければ充分だな
ならクロージャや匿名オブジェクトじゃなくて匿名メソッドが書ければ充分だな
139デフォルトの名無しさん
2014/11/15(土) 12:25:31.04ID:u4ZMuG60 楽に書けるって事じゃなくて、そのスコープで完結できるって事じゃね?
140デフォルトの名無しさん
2014/11/15(土) 12:56:58.32ID:XlhMXrhL とりあえずコードで語れば?
大規模開発でメリットが出てくるとかの話じゃないんだし
大規模開発でメリットが出てくるとかの話じゃないんだし
141デフォルトの名無しさん
2014/11/15(土) 14:40:16.71ID:EFct/v5k 見た目的にも変数の値の可視性的にもそこのスコープってとこが楽だよね
142デフォルトの名無しさん
2014/11/15(土) 14:43:26.00ID:XlhMXrhL つまりインラインでクラス定義できるのでも良いわけだよね
143デフォルトの名無しさん
2014/11/15(土) 15:14:55.72ID:EFct/v5k >>142
本来そうだけど 、
シンタックスはインラインだけど実際はただの内部クラスで、
生成時の環境を一切利用できない言語もあるから何とも言えない。
クロージャの代わりにクラスを用いると何となくそういう実装になる。
ローカル環境の代わりにインスタンス変数を用いる方向にいくから。
FILE *fp = fopen(..);
doHoge( ^(const char*msg){ fputs(msg,fp); });
fclose(fp);
みたいに簡便にクロージャ生成時の外部の変数(の値のコピー)を
保持し使用できるクロージャとは方向性が違う。
ローカルメソッドに至っては環境が一昨渡せない
シングルスレッド前提ならグローバル変数を使えばいいわけだけど
本来そうだけど 、
シンタックスはインラインだけど実際はただの内部クラスで、
生成時の環境を一切利用できない言語もあるから何とも言えない。
クロージャの代わりにクラスを用いると何となくそういう実装になる。
ローカル環境の代わりにインスタンス変数を用いる方向にいくから。
FILE *fp = fopen(..);
doHoge( ^(const char*msg){ fputs(msg,fp); });
fclose(fp);
みたいに簡便にクロージャ生成時の外部の変数(の値のコピー)を
保持し使用できるクロージャとは方向性が違う。
ローカルメソッドに至っては環境が一昨渡せない
シングルスレッド前提ならグローバル変数を使えばいいわけだけど
144デフォルトの名無しさん
2014/11/15(土) 15:54:48.49ID:uUcubJGq (擬似言語)
fw = new FileWriter();
doHoge( fw.witer );
fw.close();
こんなのをワンラインで書ければ満足なんだろ?匿名メソッドで十分じゃない
fw = new FileWriter();
doHoge( fw.witer );
fw.close();
こんなのをワンラインで書ければ満足なんだろ?匿名メソッドで十分じゃない
145デフォルトの名無しさん
2014/11/15(土) 15:58:46.71ID:EFct/v5k >>144
じゃ匿名メソッドで書いてごらんよ
じゃ匿名メソッドで書いてごらんよ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか… [BFU★]
- 中国国営メディア「沖縄は日本ではない」… ★6 [BFU★]
- 政府、株式の配当など金融所得を高齢者の医療保険料や窓口負担に反映する方針を固めた [バイト歴50年★]
- 中国国営メディア「沖縄は日本ではない」…★7 [BFU★]
- バービー、 台湾有事の発言の波紋で「たまったもんじゃない」「高市さんに真意は聞きたい」「国民に向けて説明してほしい」 [muffin★]
- ナイツ塙が指摘のローソンコーヒーカップ、ロゴ「L」で誤解生みデザイン変更へ 在庫使い切る3か月後にリニューアル [muffin★]
- 日本政府「高市総理の発言は問題ないと伝え、中国総領事のSNS投稿は問題があると中国に伝えました😊」 [931948549]
- 高市早苗、岸田政権(当時)に「台湾有事は日本の有事か」という質問をしていた [175344491]
- 【悲報】高市早苗周辺「支持層が離れるので今更発言を撤回できない」 [935793931]
- 青椒肉絲、牛肉ではなく豚肉を使うのが本物だった
- 【悲報】中国→日本行きの航空チケット、高市有事の影響で50万人分がキャンセルされる [834922174]
- んなっしょい🍬禁止🈲のお🏡
