関数型言語に必ずくっついてるこれ
いらんでしょ?匿名クラスで充分でしょ
探検
クロージャって何がいいの? [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2014/11/08(土) 13:11:47.84ID:6V2MLUHb2014/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
じゃ匿名メソッドで書いてごらんよ
じゃ匿名メソッドで書いてごらんよ
146デフォルトの名無しさん
2014/11/15(土) 23:46:47.75ID:JsFAZjCZ with (fw, new FileWriter()) {
doHoge(fw.witer);
}
こうやって書けるほうがいい
doHoge(fw.witer);
}
こうやって書けるほうがいい
147デフォルトの名無しさん
2014/11/16(日) 10:37:06.14ID:ZMiOBdAw じゃあこれは?
FILE *fp = fopen(..);
doHoge( ^(const char*msg){ fprintf(fp, "Hoge: %s\n", msg); });
fclose(fp);
FILE *fp = fopen(..);
doHoge( ^(const char*msg){ fprintf(fp, "Hoge: %s\n", msg); });
fclose(fp);
148デフォルトの名無しさん
2014/11/16(日) 11:54:54.13ID:fx2XWh+X >>146
もはや匿名メソッドすら要らない派が出てくるしww
もはや匿名メソッドすら要らない派が出てくるしww
149デフォルトの名無しさん
2014/11/18(火) 16:33:41.48ID:cuxiU0eb Java8すら使わせてもらえない人が必死なスレにしか見えなくなってきた
150デフォルトの名無しさん
2014/11/19(水) 22:27:12.37ID:eeZRz+g3 >>144,147
それだと doHoge の実行中に例外が発生するとファイルがクローズされない
たとえばクロージャを多用する Ruby のような言語だと、以下のように書く
File.open(..) do |file|
doHoge do
file.puts(msg)
end
end
Ruby ではクロージャをブロックと呼ぶけど、ブロック実行中に例外が発生しても
ファイルは確実にクローズされるし、ユーザ定義メソッドでも同様な振る舞いを実装できる
>>146
それに対して、クロージャを持たない手続き型言語の Pascal や Python といった言語では、
同じ事をするのに(>>146 のような) with 構文を使わなければ書けない
クロージャは一級市民だから引数で渡したり呼び出すことができるという自由があるけど、
with 構文はあくまで文(statement)だからクロージャと比較すれば表現力は制限される
いわばクロージャという概念を持たない言語の代用品が with 構文である
なおJavaScript はクロージャと with 構文のどちらも持っているけど、
書籍 "JavaScript: Good Parts" だとクロージャは Good Parts に
with 構文は Bad Parts に分類されている
それだと doHoge の実行中に例外が発生するとファイルがクローズされない
たとえばクロージャを多用する Ruby のような言語だと、以下のように書く
File.open(..) do |file|
doHoge do
file.puts(msg)
end
end
Ruby ではクロージャをブロックと呼ぶけど、ブロック実行中に例外が発生しても
ファイルは確実にクローズされるし、ユーザ定義メソッドでも同様な振る舞いを実装できる
>>146
それに対して、クロージャを持たない手続き型言語の Pascal や Python といった言語では、
同じ事をするのに(>>146 のような) with 構文を使わなければ書けない
クロージャは一級市民だから引数で渡したり呼び出すことができるという自由があるけど、
with 構文はあくまで文(statement)だからクロージャと比較すれば表現力は制限される
いわばクロージャという概念を持たない言語の代用品が with 構文である
なおJavaScript はクロージャと with 構文のどちらも持っているけど、
書籍 "JavaScript: Good Parts" だとクロージャは Good Parts に
with 構文は Bad Parts に分類されている
151デフォルトの名無しさん
2014/11/19(水) 23:00:05.80ID:074lLX1H クロージャばりばり使うlisp方言でもwith構文は使うよ
152デフォルトの名無しさん
2014/11/19(水) 23:12:18.42ID:3WdraWBV クロージャとクリーンアップ処理とは別の話じゃないの?
153デフォルトの名無しさん
2014/11/19(水) 23:33:41.68ID:PA9iCB5s Pythonが憎すぎて既知外になった人の相手をしちゃいけません
154デフォルトの名無しさん
2014/11/19(水) 23:39:01.13ID:QzanlTyB >>150
> なおJavaScript はクロージャと with 構文のどちらも持っているけど、
> 書籍 "JavaScript: Good Parts" だとクロージャは Good Parts に
> with 構文は Bad Parts に分類されている
お前バカじゃね? 大馬鹿じゃね?
ここで言ってるwithは例外が起きた時にリソースを解放する機能を持ったもの。
JavaScriptのwithはそんな機能は持っておらず、
obj.foo() を
with(obj) {
foo()
}
と書けるようにするためでしかなく、それによる問題(詳しくは調べて)があるから
Bad Partsになってるだけ。
PascalやPythonのwithがBad Partsになってるわけじゃない
お前、ほんと、馬鹿だよね?
> なおJavaScript はクロージャと with 構文のどちらも持っているけど、
> 書籍 "JavaScript: Good Parts" だとクロージャは Good Parts に
> with 構文は Bad Parts に分類されている
お前バカじゃね? 大馬鹿じゃね?
ここで言ってるwithは例外が起きた時にリソースを解放する機能を持ったもの。
JavaScriptのwithはそんな機能は持っておらず、
obj.foo() を
with(obj) {
foo()
}
と書けるようにするためでしかなく、それによる問題(詳しくは調べて)があるから
Bad Partsになってるだけ。
PascalやPythonのwithがBad Partsになってるわけじゃない
お前、ほんと、馬鹿だよね?
155デフォルトの名無しさん
2014/11/19(水) 23:57:41.67ID:eeZRz+g3 クロージャと with 構文のどちらも持っている言語であれば、
ケースバイケースで可読性や好みで使い分ければいいのではないかと
問題はクロージャを持たない、あるいは
「世間一般のクロージャの要件(>>104)」を満たせない言語では、
with 構文という(クロージャと比べて)不自由な代用品を使わざるをえない
という話
ケースバイケースで可読性や好みで使い分ければいいのではないかと
問題はクロージャを持たない、あるいは
「世間一般のクロージャの要件(>>104)」を満たせない言語では、
with 構文という(クロージャと比べて)不自由な代用品を使わざるをえない
という話
156デフォルトの名無しさん
2014/11/20(木) 00:02:30.91ID:fhZ8V3Hu157デフォルトの名無しさん
2014/11/20(木) 00:19:03.39ID:wJ3BgpRF >>154
>ここで言ってるwithは例外が起きた時にリソースを解放する機能を持ったもの。
わざわざ with という構文を追加して言語の意味論を複雑にしなくても、
もし汎用的な概念であるクロージャがあれば、同じ事を実現できるってことだよ
もし Python にもクロージャがあるなら、他の言語達と同様に
with 構文を使わなくてもリソースの自動解放を簡潔に表現できるハズだけど、
手続き型言語の Python では無理だろうね
それとも、書けるかな?
>ここで言ってるwithは例外が起きた時にリソースを解放する機能を持ったもの。
わざわざ with という構文を追加して言語の意味論を複雑にしなくても、
もし汎用的な概念であるクロージャがあれば、同じ事を実現できるってことだよ
もし Python にもクロージャがあるなら、他の言語達と同様に
with 構文を使わなくてもリソースの自動解放を簡潔に表現できるハズだけど、
手続き型言語の Python では無理だろうね
それとも、書けるかな?
158デフォルトの名無しさん
2014/11/20(木) 00:20:15.54ID:7GcQ+ika pythonでも引数にクロージャ受け取ってwithの中でそれを実行する関数つくれば、rubyのそれと等価じゃね?
pythonはlambdaが制限きついから複雑な処理はインラインには書けないけど。
pythonはlambdaが制限きついから複雑な処理はインラインには書けないけど。
159デフォルトの名無しさん
2014/11/20(木) 00:29:37.23ID:wJ3BgpRF160デフォルトの名無しさん
2014/11/20(木) 00:36:40.77ID:ri7Qzvfi 「世間一般のクロージャの要件」が
全然世間一般の定義じゃない件
全然世間一般の定義じゃない件
161デフォルトの名無しさん
2014/11/20(木) 00:37:00.07ID:7GcQ+ika >>159
def make_f(x):
def f(y):
return x * y
return f
例えばこんなのがあったとして、このmake_f()が返すものは何?
def make_f(x):
def f(y):
return x * y
return f
例えばこんなのがあったとして、このmake_f()が返すものは何?
162デフォルトの名無しさん
2014/11/20(木) 00:42:39.12ID:wJ3BgpRF163デフォルトの名無しさん
2014/11/20(木) 00:44:55.24ID:7GcQ+ika >>162
「クロージャみたいなモノ」もしくは「クロージャもどき」と、クロージャの違いは何?
「クロージャみたいなモノ」もしくは「クロージャもどき」と、クロージャの違いは何?
164デフォルトの名無しさん
2014/11/20(木) 00:45:40.70ID:ri7Qzvfi165デフォルトの名無しさん
2014/11/20(木) 00:47:27.27ID:wJ3BgpRF166デフォルトの名無しさん
2014/11/20(木) 00:52:13.60ID:7GcQ+ika167デフォルトの名無しさん
2014/11/20(木) 00:58:03.79ID:wJ3BgpRF168デフォルトの名無しさん
2014/11/20(木) 01:00:19.64ID:fhZ8V3Hu 今の議論と全然関係ないんだけど、久しぶりにTIOBEを見たら
ちょっと前までPerl, Python, Ruby, PHPで順位を争ってたのに
いつの間にかRubyだけ人気無くなっててワロタw
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
だからRuby信者発狂しちゃったの?
1 C
2 Java
3 Objective-C
4 C++
5 C#
6 PHP
7 Python
8 JavaScript
9 Perl
10 Visual Basic .NET
11 Visual Basic
12 R
13 Transact-SQL
14 Ruby
15 Delphi/Object Pascal
16 F#
17 PL/SQL
18 Swift
19 Pascal
20 Dart
ちょっと前までPerl, Python, Ruby, PHPで順位を争ってたのに
いつの間にかRubyだけ人気無くなっててワロタw
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
だからRuby信者発狂しちゃったの?
1 C
2 Java
3 Objective-C
4 C++
5 C#
6 PHP
7 Python
8 JavaScript
9 Perl
10 Visual Basic .NET
11 Visual Basic
12 R
13 Transact-SQL
14 Ruby
15 Delphi/Object Pascal
16 F#
17 PL/SQL
18 Swift
19 Pascal
20 Dart
169デフォルトの名無しさん
2014/11/20(木) 01:03:38.95ID:ri7Qzvfi170デフォルトの名無しさん
2014/11/20(木) 01:04:53.19ID:wJ3BgpRF171デフォルトの名無しさん
2014/11/20(木) 01:06:05.89ID:7GcQ+ika >>170
じゃあさ、これが返すものは何?
(define (make_f x)
(define (f y)
(* x y))
f)
じゃあさ、これが返すものは何?
(define (make_f x)
(define (f y)
(* x y))
f)
172デフォルトの名無しさん
2014/11/20(木) 01:07:50.18ID:fhZ8V3Hu173デフォルトの名無しさん
2014/11/20(木) 01:10:58.55ID:wJ3BgpRF174デフォルトの名無しさん
2014/11/20(木) 01:11:10.32ID:7GcQ+ika >>171
ごめん。それで (make_f 10) とか実行した時に返ってくるもの、の間違い。
ごめん。それで (make_f 10) とか実行した時に返ってくるもの、の間違い。
175デフォルトの名無しさん
2014/11/20(木) 01:15:12.19ID:wJ3BgpRF176デフォルトの名無しさん
2014/11/20(木) 01:18:52.68ID:7GcQ+ika177デフォルトの名無しさん
2014/11/20(木) 01:18:56.43ID:fhZ8V3Hu >>173
> さすがに Wikipedia のページ著者が
Wikipediaの編集者を持ち上げるのは良いけど、
お前の主張とは違う事が書いてあるぜ
読めるか?Pythonって書いてある
> クロージャを持つ言語に、C# 3.0、C++11、ECMAScript(JavaScriptを含む)、Groovy、Java 8(予定)、
> Perl、Python、Ruby、PHP(5.3以降)、Lua、Squirrelなどがある。
> さすがに Wikipedia のページ著者が
Wikipediaの編集者を持ち上げるのは良いけど、
お前の主張とは違う事が書いてあるぜ
読めるか?Pythonって書いてある
> クロージャを持つ言語に、C# 3.0、C++11、ECMAScript(JavaScriptを含む)、Groovy、Java 8(予定)、
> Perl、Python、Ruby、PHP(5.3以降)、Lua、Squirrelなどがある。
178デフォルトの名無しさん
2014/11/20(木) 01:28:21.39ID:wJ3BgpRF179デフォルトの名無しさん
2014/11/20(木) 01:32:42.88ID:fhZ8V3Hu180デフォルトの名無しさん
2014/11/20(木) 09:44:37.50ID:BfhGUngW with構文はスコープから抜ける時にclose的な関数を必ず呼び出してくれる保証があるけど、
Rubyのブロックにはそんな保証は無い
だからRubyではウッカリcloseを忘れても分かりにくい
そういうのは良くない
Rubyのブロックにはそんな保証は無い
だからRubyではウッカリcloseを忘れても分かりにくい
そういうのは良くない
181デフォルトの名無しさん
2014/11/20(木) 11:08:08.37ID:nwROesTX >>178
> Wikipedia の記事が常に 100% 正しいと思っているのかな?
思ってないけど、あんたが言っていることよりかは
正しいと思うね。
だって、あんたの言うことのほうが正しいなら
wikipediaを修正すればいいわけだから。
> Wikipedia の記事が常に 100% 正しいと思っているのかな?
思ってないけど、あんたが言っていることよりかは
正しいと思うね。
だって、あんたの言うことのほうが正しいなら
wikipediaを修正すればいいわけだから。
182デフォルトの名無しさん
2014/11/20(木) 12:57:07.44ID:5gFBGGbj なんだ、この偏執狂たちの罵り合いはw
そんなことより、問題。
若い内に買ってでもしろ、と言われるものはなぁんだ?
そんなことより、問題。
若い内に買ってでもしろ、と言われるものはなぁんだ?
183デフォルトの名無しさん
2014/11/20(木) 15:15:51.24ID:W3M4RtQD ああ、let-inが無いからpythonのはクロージャじゃないって主張か。
斜め上だな。
斜め上だな。
184デフォルトの名無しさん
2014/11/20(木) 16:40:50.21ID:2szoNUEC 環境と変数を手軽に包めるのは有難いけどなあ
XMLベースのジョブ管理言語とか
ちょっとしたVM作るときに
継続の表現にクロージャなしだとだるいよ
さらに無名クラスも無い言語だと
本物のVM作らなきゃいけなくなる
XMLベースのジョブ管理言語とか
ちょっとしたVM作るときに
継続の表現にクロージャなしだとだるいよ
さらに無名クラスも無い言語だと
本物のVM作らなきゃいけなくなる
185デフォルトの名無しさん
2014/11/20(木) 20:12:20.93ID:IqIimPum186デフォルトの名無しさん
2014/11/21(金) 13:07:27.23ID:obtZMam2187デフォルトの名無しさん
2014/11/21(金) 13:13:28.47ID:zygDXSz1 >>186
ご愁傷さまです。
ご愁傷さまです。
188デフォルトの名無しさん
2014/11/29(土) 13:01:53.24ID:OX49RFg5 >>188
?
?
189デフォルトの名無しさん
2014/12/10(水) 19:56:15.27ID:veDvxwge Swift スレでクロージャの話題で荒れそうだったので、こちらへ移動しとく
http://peace.2ch.net/test/read.cgi/tech/1415860741/153
--
Swift や Ruby を含む多くの言語では常識であるけど Python では異なるものとして、
関数型言語に由来した(無名関数やラムダ式とも呼ばれる)クロージャがある
たとえば "The Swift Programming Language" の "Closure" の章にある map メソッドを使った
サンプルコードは、Ruby でも同じスタイルの良く似たコードで書き直せる:
http://ideone.com/TsGD6B
これは Ruby だけでなく、JavaScript でも同じ
Swift や Ruby と比べて構文が簡潔な JavaScript ではいくらか冗長にはなるけれど、
何の苦もなく Swift と同じスタイルで書き直せる:
http://ideone.com/74oNVU
同様に、「あるテーブルから特定の行だけを抽出し、加工して、集計する処理」は、
Swift だと table.filter { .... }.map { .... }.reduce { .... } とメソッドを連結(チェイン)させた式で書ける
これは Ruby なら table.select { .... }.map { .... }.inject { .... } と書き直せる
ここで、クロージャ内の ..... の部分には、上記のサンプルのように「任意の文(statements)が書ける」
もしかすると、いやこんなの高階関数のプログラミングを知っている人なら当たり前だろ、と感じるかもしれない
ところが Python だけはクロージャの本体に(任意の文ではなく)「式(expression)しか書けない」:
http://ideone.com/tDaDkL # --> Syntax Error になってしまう
だから、他の言語のクロージャに相当するコードを(名前のある)関数としてわざわざ宣言しなければならない:
http://ideone.com/R7twCQ
結果として、Python は手続き型プログラミングであれば簡潔で可読性に優れたコードが書けるスクリプト言語だけれど、
関数型プログラミングには適さず、こうした関数型プログラミングは推奨されていないらしい(これを "酸っぱい葡萄" と言ふ)
http://peace.2ch.net/test/read.cgi/tech/1345123070/70-71
これが Swift や Ruby 等と比較すると、関数型プログラミングで Python が劣る典型的な一例になる
http://peace.2ch.net/test/read.cgi/tech/1415860741/153
--
Swift や Ruby を含む多くの言語では常識であるけど Python では異なるものとして、
関数型言語に由来した(無名関数やラムダ式とも呼ばれる)クロージャがある
たとえば "The Swift Programming Language" の "Closure" の章にある map メソッドを使った
サンプルコードは、Ruby でも同じスタイルの良く似たコードで書き直せる:
http://ideone.com/TsGD6B
これは Ruby だけでなく、JavaScript でも同じ
Swift や Ruby と比べて構文が簡潔な JavaScript ではいくらか冗長にはなるけれど、
何の苦もなく Swift と同じスタイルで書き直せる:
http://ideone.com/74oNVU
同様に、「あるテーブルから特定の行だけを抽出し、加工して、集計する処理」は、
Swift だと table.filter { .... }.map { .... }.reduce { .... } とメソッドを連結(チェイン)させた式で書ける
これは Ruby なら table.select { .... }.map { .... }.inject { .... } と書き直せる
ここで、クロージャ内の ..... の部分には、上記のサンプルのように「任意の文(statements)が書ける」
もしかすると、いやこんなの高階関数のプログラミングを知っている人なら当たり前だろ、と感じるかもしれない
ところが Python だけはクロージャの本体に(任意の文ではなく)「式(expression)しか書けない」:
http://ideone.com/tDaDkL # --> Syntax Error になってしまう
だから、他の言語のクロージャに相当するコードを(名前のある)関数としてわざわざ宣言しなければならない:
http://ideone.com/R7twCQ
結果として、Python は手続き型プログラミングであれば簡潔で可読性に優れたコードが書けるスクリプト言語だけれど、
関数型プログラミングには適さず、こうした関数型プログラミングは推奨されていないらしい(これを "酸っぱい葡萄" と言ふ)
http://peace.2ch.net/test/read.cgi/tech/1345123070/70-71
これが Swift や Ruby 等と比較すると、関数型プログラミングで Python が劣る典型的な一例になる
190デフォルトの名無しさん
2014/12/10(水) 20:24:01.24ID:Q728OFWk と言うかどう見てもこないだまでこのスレに居た俺俺定義の人ですな
191デフォルトの名無しさん
2014/12/10(水) 20:43:29.64ID:Q728OFWk よく見たら、そのスレで誘導かけてるの、話振ったお前本人じゃねーかw
俺俺定義が認められなかったから逃げて来たのか?
俺俺定義が認められなかったから逃げて来たのか?
192デフォルトの名無しさん
2014/12/10(水) 21:30:40.85ID:AwBDqpLr クロージャの定義は>>4って書かれてたがStandard MLにラムダ式はない
けど当然SMLにはクロージャがあるわけで
ソースはThe Definition of Standard ML, revised edition
けど当然SMLにはクロージャがあるわけで
ソースはThe Definition of Standard ML, revised edition
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか… [BFU★]
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… [BFU★]
- 中国国営メディア「沖縄は日本ではない」… ★6 [BFU★]
- 政府、株式の配当など金融所得を高齢者の医療保険料や窓口負担に反映する方針を固めた [バイト歴50年★]
- バービー、 台湾有事の発言の波紋で「たまったもんじゃない」「高市さんに真意は聞きたい」「国民に向けて説明してほしい」 [muffin★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★2 [BFU★]
- 中国高官と話す外務省局長の表情、やばい [175344491]
- 【高市速報】小野田キミ「中国依存はリスク」断交を示唆か [931948549]
- 日本政府「高市総理の発言は問題ないと伝え、中国総領事のSNS投稿は問題があると中国に伝えました😊」 [931948549]
- 【んな専🏡】なんG 姫森ルーナ(・o・🍬)総合スレ🏰【ホロライブ▶】
- 【速報】中国、高市の発言撤回を改めて要求 [834922174]
- 【悲報】高市早苗周辺「支持層が離れるので今更発言を撤回できない」 [935793931]
