1 名前:デフォルトの名無しさん [2014/11/08(土) 13:11:47.84 ID:6V2MLUHb.net] 関数型言語に必ずくっついてるこれ いらんでしょ?匿名クラスで充分でしょ
99 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 23:36:58.94 ID:lx9et4kr.net] >>96 関数は局所環境持ってても「真のクロージャ」じゃないってこと? Yes/Noで答えて
100 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 23:39:26.26 ID:nlmXbEn2.net] 真のクロージャとかいうオレオレ用語 もちろん引用もなければ定義もない
101 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 23:40:53.08 ID:KOr7L+hP.net] >>95 クロージャという概念を正しく理解していないと、 Python みたいなラムダ式に欠陥のある言語が設計されてしまうというお話だよ 言い換えると、クロージャという概念を用いると、 なぜ Python のラムダ式が欠陥品なのかを明解に説明できる このクロージャの利点は、このスレの主旨からは逸脱していないと思うよ
102 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 23:42:02.22 ID:nlmXbEn2.net] >>101 お前がこのスレで一番クロージャを理解してない件 構文の字面しか見てないし
103 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 23:57:43.62 ID:KOr7L+hP.net] >>99 No だね あえていえば「クロージャもどき」とか「なんちゃってクロージャ」だね 真のクロージャであれば無名関数でも間数定義でも作られ、 無名関数であってもクロージャを構成する局所環境を持つことができる これが、 C#、Java8、C++11、JavaScript、Ruby 等々の 「ふつうの言語」における「ふつうのクロージャ」だ おそらくクロージャを正しく理解していなかったんだろね、Python 言語設計者達は....
104 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 23:59:39.38 ID:yjLcynWs.net] 話をまとめよう 世間一般のクロージャの要件: 局所環境を持つ(変数を束縛できる) 関数をインラインで書ける キチガイのクロージャの要件: クソージャの中にクソージャが書ける 若しくは 言語設計上の欠陥を見落としたことを認める(>>87 の発言) のいずれか
105 名前:デフォルトの名無しさん mailto:sage [2014/11/10(月) 00:08:24.74 ID:LMH7nFF4.net] >>104 添削してあげよう -- 話をまとめよう 世間一般のクロージャの要件(C#、Java8、C++11、JavaScript、Ruby 等々): 関数であっても無名関数であっても、局所環境を持つ(変数を束縛できる):>>53 ,56,77 Python に固有なクロージャの要件: 関数だけが局所環境を持つ(変数を束縛できる):>>74 無名関数では局所環境を持てない(変数を束縛できない):>>47 ,83
106 名前:デフォルトの名無しさん mailto:sage [2014/11/10(月) 00:14:31.96 ID:cCGgoLPL.net] まあここはscheme最強っていう事にしておきますか。
107 名前:デフォルトの名無しさん mailto:sage [2014/11/10(月) 00:28:52.73 ID:LMH7nFF4.net] >>102 > 構文の字面しか見てないし だとすれば、Martin Fowler氏も「構文の字面しか見てない」ってもとになるんだろな ・Martin Fowler's Bliki in Japanese - クロージャ capsctrl.que.jp/kdmsnr/wiki/bliki/?Closure Lsip/Smalltalk/Ruby/JavaScript といったプログラミング言語では、 クロージャやブロックを多用したスタイルが好まれる だから、Python みたいな無名関数で局所環境を持てない言語で同じようにクロージャを 多用するスタイルを試みると、「ラムダ式が入れ子でカッコだらけ(>>47 )」な汚いコードや、 いちいち「関数定義しなければならない(>>74 )」ケースと頻繁に出会うから、ストレスが溜まる まあ「Python は手続き型言語」だから仕方ないんだよと自分に言い聞かせて我慢してるけど、 プログラミング言語を自由に選べるなら、真っ先に Python は除外するね、自分なら もし、これが「構文の字面しか見てない」と思えるのなら、それはそれでもいいんじゃないのかもね.....
108 名前:デフォルトの名無しさん mailto:sage [2014/11/10(月) 00:37:52.21 ID:cCGgoLPL.net] Pythonはlambdaの不便さも含めて構文がアレなので大嫌いだけど、 ライブラリが色々そろってて便利だから結局よく使っているのであった。
109 名前:デフォルトの名無しさん mailto:sage [2014/11/10(月) 00:42:53.31 ID:zIX5GD/A.net] pythonのlambdaってmapやfilterを追加したときに申し訳程度に付けたって感じ
110 名前:デフォルトの名無しさん mailto:sage [2014/11/10(月) 01:06:17.40 ID:s5NqatD+P] だね。Python使いはlambdaが互換性のためだけに残ってる欠陥品って認識あるから デモとかどうしても1行で書きたいときしか使わんけど、 シンタックスシュガーの実体がlambdaな方面からするとそんな事情しらんしキモいかもね。 defで名前付きで書くのがふつうだし機能上困ってない。
111 名前:デフォルトの名無しさん mailto:sage [2014/11/10(月) 02:52:22.03 ID:qQmxJFhq.net] >>107 その文章を書いた人の考えと、君の解釈には随分とズレがあるようだ
112 名前:デフォルトの名無しさん mailto:sage [2014/11/10(月) 06:04:53.17 ID:i3Y7RgoA.net] 馬鹿には無理
113 名前:デフォルトの名無しさん mailto:sage [2014/11/10(月) 07:14:42.95 ID:0mRy26rG.net] Pythonの不自由さ(関数型のクロージャに近いの)はGuidoの方針じゃないの? 嫌なら、おとなしくジェネレータ使えばいいじゃん。
114 名前:デフォルトの名無しさん mailto:sage [2014/11/10(月) 08:48:39.72 ID:PWSP4TjP.net] クロージャは何がいいんだよ! https://i.imgur.com/fTQTEYN.gif
115 名前:デフォルトの名無しさん mailto:sage [2014/11/10(月) 09:04:03.39 ID:HTkQymog.net] 引数に別名付けたくなる程に中身が長いなら 関数にも名前付けろってのがGuidoの方針なんだろ 文法的に拡張可能なのに、あえてリジェクトしてるくらいだし www.artima.com/weblogs/viewpost.jsp?thread=147358
116 名前:デフォルトの名無しさん mailto:sage [2014/11/10(月) 10:20:30.55 ID:CeTPRNSr.net] >>107 Martin Fowlerは字面だけを見てないから、ちゃんとPythonにもクロージャがあると思ってるよ お前が張ったリンク先の「他の言語」を見てみろ
117 名前:1 mailto:sage [2014/11/10(月) 11:39:28.98 ID:rdbd3Lyi.net] 何がクロージャかよりどこが好きかでクロージャを語れよ!!(ドンッ
118 名前:デフォルトの名無しさん mailto:sage [2014/11/10(月) 20:33:09.35 ID:AR7BQCkT.net] クロージャとメソッドで f[x] と f(x) を使い分けなきゃダメなRubyが 一番ウンコだと思う
119 名前:デフォルトの名無しさん mailto:sage [2014/11/10(月) 20:39:42.07 ID:5eyjbk6/.net] >>118 それはクロージャとメソッドではなく、Procとメソッドだと思う Rubyのクロージャはブロックのほうの機能と考えたほうが良いんじゃないかな
120 名前:デフォルトの名無しさん [2014/11/10(月) 21:34:09.37 ID:Xzn5T3EF.net] >>117 俺の財宝か?欲しけりゃくれてやる。 探せ!この世の全てをそこに置いてきた。
121 名前:デフォルトの名無しさん mailto:sage [2014/11/10(月) 22:47:25.14 ID:oQ75X8QG.net] 文系出身プログラマ「クロージャ?なにそれ?服入れるとこ??」 ってやつに対してドヤ顔ができる
122 名前:デフォルトの名無しさん mailto:sage [2014/11/11(火) 06:32:45.68 ID:G8l0apNf.net] クロー系の最強魔法です 消費MP60
123 名前:118 mailto:sage [2014/11/11(火) 21:00:28.44 ID:UknPa1bY.net] レスお願いします
124 名前:デフォルトの名無しさん mailto:sage [2014/11/11(火) 22:06:02.40 ID:3gT2I0NB.net] 若い時に買ってでもすることは? 苦労じゃ!くろうじゃ!クロージャ!
125 名前:デフォルトの名無しさん mailto:sage [2014/11/12(水) 01:25:01.41 ID:G1/eYMX4.net] クロージャの良さを、クロージャを使うことで劇的に 簡潔になる例を使って説明してください
126 名前:デフォルトの名無しさん mailto:sage [2014/11/12(水) 07:27:28.43 ID:ptlTHlgg.net] コールバック関数を別途書かなくて良くなります。 もしコールバック関数の為だけにインスタンス変数を定義していたなら、 それも必要が無くなります。 消費MP 5
127 名前:デフォルトの名無しさん mailto:sage [2014/11/12(水) 08:10:30.04 ID:G1/eYMX4.net] コールバック関数地獄のJSのコードは 可読性が悪い上に簡潔でも無いので、失格です
128 名前:デフォルトの名無しさん mailto:sage [2014/11/12(水) 08:13:15.39 ID:/hly7+iy.net] オールバックって額からハゲるだろ?
129 名前:デフォルトの名無しさん mailto:sage [2014/11/12(水) 08:27:11.27 ID:cKuXIrT/.net] >>127 そんなあなたにClojureScript。 core.asyncのチャネルでスッキリしますよ(Go由来のようだけど)
130 名前:デフォルトの名無しさん mailto:sage [2014/11/12(水) 20:27:05.24 ID:3VJGATlA.net] >>129 コールバック自体がダメなんだよ。 例えば、addEventLisnerの引数にコールバックを指定する。 これだけでも可読性悪いだろ。
131 名前:デフォルトの名無しさん mailto:sage [2014/11/12(水) 20:37:53.49 ID:L8labB6g.net] 見慣れてるかどうかだと思うけどな
132 名前:デフォルトの名無しさん mailto:sage [2014/11/12(水) 20:38:24.71 ID:5GyhUZuz.net] >>130 代案も出さずに批判だけするなら、幼稚園児にだってできるよ
133 名前:デフォルトの名無しさん mailto:sage [2014/11/12(水) 20:52:00.80 ID:UPi6O5bX.net] リスナーI/Fをインプリメントしたオブジェクト渡せばいいのでは
134 名前:デフォルトの名無しさん mailto:sage [2014/11/12(水) 21:14:25.68 ID:ptlTHlgg.net] それではそのオブジェクトを定義しなくてはならなくなります。 クロージャはそのようなデリゲートオブジェクトやコールバックパターンからの解放なのです。 消費MP 12
135 名前:デフォルトの名無しさん mailto:sage [2014/11/12(水) 21:16:45.87 ID:eep146vT.net] JavaScript(だけに限らないが) クロージャーが見難いんじゃなくて 非同期の入れ子が見にくいんだろ。 で、それを解決するライブラリが存在する。 結局のところ、そのライブラリ Promiseとかを使えば解決する問題。
136 名前:デフォルトの名無しさん mailto:sage [2014/11/12(水) 21:23:36.45 ID:G1/eYMX4.net] 結局のところ、コールバックはクロージャのメリットじゃないんですね? もっと良い方法があるのですから
137 名前:デフォルトの名無しさん mailto:sage [2014/11/12(水) 21:36:55.56 ID:ptlTHlgg.net] いや、クロージャ使ってそのスコープで解決しちゃえばコールバック関数要らないって話なんだが。
138 名前:デフォルトの名無しさん mailto:sage [2014/11/12(水) 21:59:20.14 ID:G1/eYMX4.net] Haskellのdo記法みたいなのがあれば クロージャをチェインしていっても読み難くならないという話ですか?
139 名前:デフォルトの名無しさん mailto:sage [2014/11/12(水) 22:58:17.02 ID:L8labB6g.net] 小規模なコールバックだったらインラインで書いた方が見通しが良いだろうし、 複雑なのだったら分けて書いた方が理解しやすいだろうし、 あれが最強他はゴミとか言ってるのが一番ダメなんじゃね?
140 名前:デフォルトの名無しさん mailto:sage [2014/11/15(土) 12:17:49.98 ID:uUcubJGq.net] 結局クロージャの利点てコールバックが楽にかけるってだけ? ならクロージャや匿名オブジェクトじゃなくて匿名メソッドが書ければ充分だな
141 名前:デフォルトの名無しさん mailto:sage [2014/11/15(土) 12:25:31.04 ID:u4ZMuG60.net] 楽に書けるって事じゃなくて、そのスコープで完結できるって事じゃね?
142 名前:デフォルトの名無しさん mailto:sage [2014/11/15(土) 12:56:58.32 ID:XlhMXrhL.net] とりあえずコードで語れば? 大規模開発でメリットが出てくるとかの話じゃないんだし
143 名前:デフォルトの名無しさん mailto:sage [2014/11/15(土) 14:40:16.71 ID:EFct/v5k.net] 見た目的にも変数の値の可視性的にもそこのスコープってとこが楽だよね
144 名前:デフォルトの名無しさん mailto:sage [2014/11/15(土) 14:43:26.00 ID:XlhMXrhL.net] つまりインラインでクラス定義できるのでも良いわけだよね
145 名前:デフォルトの名無しさん mailto:sage [2014/11/15(土) 15:14:55.72 ID:EFct/v5k.net] >>144 本来そうだけど 、 シンタックスはインラインだけど実際はただの内部クラスで、 生成時の環境を一切利用できない言語もあるから何とも言えない。 クロージャの代わりにクラスを用いると何となくそういう実装になる。 ローカル環境の代わりにインスタンス変数を用いる方向にいくから。 FILE *fp = fopen(..); doHoge( ^(const char*msg){ fputs(msg,fp); }); fclose(fp); みたいに簡便にクロージャ生成時の外部の変数(の値のコピー)を 保持し使用できるクロージャとは方向性が違う。 ローカルメソッドに至っては環境が一昨渡せない シングルスレッド前提ならグローバル変数を使えばいいわけだけど
146 名前:デフォルトの名無しさん mailto:sage [2014/11/15(土) 15:54:48.49 ID:uUcubJGq.net] (擬似言語) fw = new FileWriter(); doHoge( fw.witer ); fw.close(); こんなのをワンラインで書ければ満足なんだろ?匿名メソッドで十分じゃない
147 名前:デフォルトの名無しさん mailto:sage [2014/11/15(土) 15:58:46.71 ID:EFct/v5k.net] >>146 じゃ匿名メソッドで書いてごらんよ
148 名前:デフォルトの名無しさん mailto:sage [2014/11/15(土) 23:46:47.75 ID:JsFAZjCZ.net] with (fw, new FileWriter()) { doHoge(fw.witer); } こうやって書けるほうがいい
149 名前:デフォルトの名無しさん mailto:sage [2014/11/16(日) 10:37:06.14 ID:ZMiOBdAw.net] じゃあこれは? FILE *fp = fopen(..); doHoge( ^(const char*msg){ fprintf(fp, "Hoge: %s\n", msg); }); fclose(fp);
150 名前:デフォルトの名無しさん mailto:sage [2014/11/16(日) 11:54:54.13 ID:fx2XWh+X.net] >>148 もはや匿名メソッドすら要らない派が出てくるしww
151 名前:デフォルトの名無しさん mailto:sage [2014/11/18(火) 16:33:41.48 ID:cuxiU0eb.net] Java8すら使わせてもらえない人が必死なスレにしか見えなくなってきた
152 名前:デフォルトの名無しさん mailto:sage [2014/11/19(水) 22:27:12.37 ID:eeZRz+g3.net] >>146 ,147 それだと doHoge の実行中に例外が発生するとファイルがクローズされない たとえばクロージャを多用する Ruby のような言語だと、以下のように書く File.open(..) do |file| doHoge do file.puts(msg) end end Ruby ではクロージャをブロックと呼ぶけど、ブロック実行中に例外が発生しても ファイルは確実にクローズされるし、ユーザ定義メソッドでも同様な振る舞いを実装できる >>148 それに対して、クロージャを持たない手続き型言語の Pascal や Python といった言語では、 同じ事をするのに(>>148 のような) with 構文を使わなければ書けない クロージャは一級市民だから引数で渡したり呼び出すことができるという自由があるけど、 with 構文はあくまで文(statement)だからクロージャと比較すれば表現力は制限される いわばクロージャという概念を持たない言語の代用品が with 構文である なおJavaScript はクロージャと with 構文のどちらも持っているけど、 書籍 "JavaScript: Good Parts" だとクロージャは Good Parts に with 構文は Bad Parts に分類されている
153 名前:デフォルトの名無しさん mailto:sage [2014/11/19(水) 23:00:05.80 ID:074lLX1H.net] クロージャばりばり使うlisp方言でもwith構文は使うよ
154 名前:デフォルトの名無しさん mailto:sage [2014/11/19(水) 23:12:18.42 ID:3WdraWBV.net] クロージャとクリーンアップ処理とは別の話じゃないの?
155 名前:デフォルトの名無しさん mailto:sage [2014/11/19(水) 23:33:41.68 ID:PA9iCB5s.net] Pythonが憎すぎて既知外になった人の相手をしちゃいけません
156 名前:デフォルトの名無しさん mailto:sage [2014/11/19(水) 23:39:01.13 ID:QzanlTyB.net] >>152 > なお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になってるわけじゃない お前、ほんと、馬鹿だよね?
157 名前:デフォルトの名無しさん mailto:sage [2014/11/19(水) 23:57:41.67 ID:eeZRz+g3.net] クロージャと with 構文のどちらも持っている言語であれば、 ケースバイケースで可読性や好みで使い分ければいいのではないかと 問題はクロージャを持たない、あるいは 「世間一般のクロージャの要件(>>105 )」を満たせない言語では、 with 構文という(クロージャと比べて)不自由な代用品を使わざるをえない という話
158 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 00:02:30.91 ID:fhZ8V3Hu.net] >>152 >>157 下の(a)と(b)が等価であるようなJSのwith構文と リソース解放のwith構文の区別もつかないような馬鹿が 何書いても説得力無いよ // (a) with (obj) { a = b; } // (b) if (obj.a === undefined) { a = obj.b === undefined ? b : obj.b; } else { obj.a = obj.b === undefined ? b : obj.b; } withって字面だけ見て同じだと思っちゃったの? そんなだから構文の字面しか見てない馬鹿って言われちゃうんだよ
159 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 00:19:03.39 ID:wJ3BgpRF.net] >>156 >ここで言ってるwithは例外が起きた時にリソースを解放する機能を持ったもの。 わざわざ with という構文を追加して言語の意味論を複雑にしなくても、 もし汎用的な概念であるクロージャがあれば、同じ事を実現できるってことだよ もし Python にもクロージャがあるなら、他の言語達と同様に with 構文を使わなくてもリソースの自動解放を簡潔に表現できるハズだけど、 手続き型言語の Python では無理だろうね それとも、書けるかな?
160 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 00:20:15.54 ID:7GcQ+ika.net] pythonでも引数にクロージャ受け取ってwithの中でそれを実行する関数つくれば、rubyのそれと等価じゃね? pythonはlambdaが制限きついから複雑な処理はインラインには書けないけど。
161 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 00:29:37.23 ID:wJ3BgpRF.net] >>160 >それを実行する関数つくれば、 もし Python が「世間一般のクロージャの要件(>>105 )」を満たしていれば、 「関数をつくらなくても」クロージャだけで簡潔に書けるはず つまり「関数をつくらなければ書けない」ということは、 Python が「世間一般のクロージャの要件」を満たしていないことを認めたってこと
162 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 00:36:40.77 ID:ri7Qzvfi.net] 「世間一般のクロージャの要件」が 全然世間一般の定義じゃない件
163 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 00:37:00.07 ID:7GcQ+ika.net] >>161 def make_f(x): def f(y): return x * y return f 例えばこんなのがあったとして、このmake_f()が返すものは何?
164 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 00:42:39.12 ID:wJ3BgpRF.net] >>163 「クロージャみたいなモノ」もしくは「クロージャもどき」 def make_f(x): return lambda(y): x * y が返すのも同じ
165 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 00:44:55.24 ID:7GcQ+ika.net] >>164 「クロージャみたいなモノ」もしくは「クロージャもどき」と、クロージャの違いは何?
166 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 00:45:40.70 ID:ri7Qzvfi.net] >>164 >>32 の定義だと完璧にクロージャの条件を満たしてるけど? 君はどこのローカルルールの話をしてるの?
167 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 00:47:27.27 ID:wJ3BgpRF.net] >>165 >>105
168 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 00:52:13.60 ID:7GcQ+ika.net] >>167 >世間一般のクロージャの要件(C#、Java8、C++11、JavaScript、Ruby 等々): > 関数であっても無名関数であっても、局所環境を持つ(変数を束縛できる):>>53 ,56,77 >>163 のmake_f()が返すものは局所環境をもってるし名前も付いてないよ。
169 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 00:58:03.79 ID:wJ3BgpRF.net] >>166 いや、Python は関数を定義しなければ局所環境が作られないんだから、 >>32 の要件は満たしていないだろ >>32 には「ラムダ式や無名関数で実現している」と書かれているんだけど、 日本語が不自由なんですか? 実際、もしも >>32 の定義を満たしているなら、 >>47 のゴチャゴチャしたコードは (>>74 のようにわざわざ関数を定義しなくても) >>84 のように「ラムダ式や無名関数で実現している」 簡潔なコードに書き直せるはずだ さて、論よりコード、>>166 は書き直せるかな?
170 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 01:00:19.64 ID:fhZ8V3Hu.net] 今の議論と全然関係ないんだけど、久しぶりにTIOBEを見たら ちょっと前までPerl, Python, Ruby, PHPで順位を争ってたのに いつの間にかRubyだけ人気無くなっててワロタw 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
171 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 01:03:38.95 ID:ri7Qzvfi.net] >>169 >>32 には「いくつかの言語では」と前置きされてるじゃん つまりラムダ式や無名関数は必要条件ではない そっちこそ日本語が不自由すぎるのでは?
172 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 01:04:53.19 ID:wJ3BgpRF.net] >>168 それは def f(x): で関数を定義しているから、当たり前の話 「世間一般のクロージャ」であれば、わざわざ関数を定義しなくても ラムダ式や無名関数と呼ばれる構文でクロージャを作れるんだよ >>32 をよく読み直そうね
173 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 01:06:05.89 ID:7GcQ+ika.net] >>172 じゃあさ、これが返すものは何? (define (make_f x) (define (f y) (* x y)) f)
174 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 01:07:50.18 ID:fhZ8V3Hu.net] >>172 > >>32 をよく読み直そうね お前が100回読み直した方が良いぜw
175 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 01:10:58.55 ID:wJ3BgpRF.net] >>171 >>32 にある「いくつかの言語では」という前置きは、 後から出てくる Smalltalk や Ruby のブロック構文を指すと 考えるのが自然じゃないかな? さすがに Wikipedia のページ著者が 「ラムダ式や無名関数」と「関数定義」との違いも 分からないほどのお馬鹿さんだとは思えないしね
176 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 01:11:10.32 ID:7GcQ+ika.net] >>173 ごめん。それで (make_f 10) とか実行した時に返ってくるもの、の間違い。
177 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 01:15:12.19 ID:wJ3BgpRF.net] >>173 クロージャだね (define (make_f x) (lambda (x) (* x y)) ) が返すのもクロージャだね
178 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 01:18:52.68 ID:7GcQ+ika.net] >>177 >>163 のpythonのコードと完全に同じなんだけどw
179 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 01:18:56.43 ID:fhZ8V3Hu.net] >>175 > さすがに Wikipedia のページ著者が Wikipediaの編集者を持ち上げるのは良いけど、 お前の主張とは違う事が書いてあるぜ 読めるか?Pythonって書いてある > クロージャを持つ言語に、C# 3.0、C++11、ECMAScript(JavaScriptを含む)、Groovy、Java 8(予定)、 > Perl、Python、Ruby、PHP(5.3以降)、Lua、Squirrelなどがある。
180 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 01:28:21.39 ID:wJ3BgpRF.net] >>179 Wikipedia の記事が常に 100% 正しいと思っているのかな? 記事の冒頭にある >>32 のクロージャという用語の定義とは 矛盾していると思うけどね (自分のクロージャという用語の定義は >>4 で書いた) もし矛盾していないと反論したいのなら、論よりコードだ >>47 のゴチャゴチャしたコードは (>>74 のようにわざわざ関数を定義しなくても) >>84 のようにラムダ式や無名関数だけで書き直せるはず さて、>>179 は書き直せるかな?
181 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 01:32:42.88 ID:fhZ8V3Hu.net] >>180 >>171 が正解と考えれば全く矛盾してないので、お前が間違ってるんだよ
182 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 09:44:37.50 ID:BfhGUngW.net] with構文はスコープから抜ける時にclose的な関数を必ず呼び出してくれる保証があるけど、 Rubyのブロックにはそんな保証は無い だからRubyではウッカリcloseを忘れても分かりにくい そういうのは良くない
183 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 11:08:08.37 ID:nwROesTX.net] >>180 > Wikipedia の記事が常に 100% 正しいと思っているのかな? 思ってないけど、あんたが言っていることよりかは 正しいと思うね。 だって、あんたの言うことのほうが正しいなら wikipediaを修正すればいいわけだから。
184 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 12:57:07.44 ID:5gFBGGbj.net] なんだ、この偏執狂たちの罵り合いはw そんなことより、問題。 若い内に買ってでもしろ、と言われるものはなぁんだ?
185 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 15:15:51.24 ID:W3M4RtQD.net] ああ、let-inが無いからpythonのはクロージャじゃないって主張か。 斜め上だな。
186 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 16:40:50.21 ID:2szoNUEC.net] 環境と変数を手軽に包めるのは有難いけどなあ XMLベースのジョブ管理言語とか ちょっとしたVM作るときに 継続の表現にクロージャなしだとだるいよ さらに無名クラスも無い言語だと 本物のVM作らなきゃいけなくなる
187 名前:デフォルトの名無しさん mailto:sage [2014/11/20(木) 20:12:20.93 ID:IqIimPum.net] https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Closures
188 名前:デフォルトの名無しさん mailto:sage [2014/11/21(金) 13:07:27.23 ID:obtZMam2.net] >>184 セックス…かな 年とると立たなくなるから
189 名前:デフォルトの名無しさん mailto:sage [2014/11/21(金) 13:13:28.47 ID:zygDXSz1.net] >>188 ご愁傷さまです。
190 名前:デフォルトの名無しさん mailto:sage [2014/11/29(土) 13:01:53.24 ID:OX49RFg5.net] >>190 ?
191 名前:デフォルトの名無しさん mailto:sage [2014/12/10(水) 19:56:15.27 ID:veDvxwge.net] Swift スレでクロージャの話題で荒れそうだったので、こちらへ移動しとく peace.2ch.net/test/read.cgi/tech/1415860741/153 -- Swift や Ruby を含む多くの言語では常識であるけど Python では異なるものとして、 関数型言語に由来した(無名関数やラムダ式とも呼ばれる)クロージャがある たとえば "The Swift Programming Language" の "Closure" の章にある map メソッドを使った サンプルコードは、Ruby でも同じスタイルの良く似たコードで書き直せる: ideone.com/TsGD6B これは Ruby だけでなく、JavaScript でも同じ Swift や Ruby と比べて構文が簡潔な JavaScript ではいくらか冗長にはなるけれど、 何の苦もなく Swift と同じスタイルで書き直せる: ideone.com/74oNVU 同様に、「あるテーブルから特定の行だけを抽出し、加工して、集計する処理」は、 Swift だと table.filter { .... }.map { .... }.reduce { .... } とメソッドを連結(チェイン)させた式で書ける これは Ruby なら table.select { .... }.map { .... }.inject { .... } と書き直せる ここで、クロージャ内の ..... の部分には、上記のサンプルのように「任意の文(statements)が書ける」 もしかすると、いやこんなの高階関数のプログラミングを知っている人なら当たり前だろ、と感じるかもしれない ところが Python だけはクロージャの本体に(任意の文ではなく)「式(expression)しか書けない」: ideone.com/tDaDkL # --> Syntax Error になってしまう だから、他の言語のクロージャに相当するコードを(名前のある)関数としてわざわざ宣言しなければならない: ideone.com/R7twCQ 結果として、Python は手続き型プログラミングであれば簡潔で可読性に優れたコードが書けるスクリプト言語だけれど、 関数型プログラミングには適さず、こうした関数型プログラミングは推奨されていないらしい(これを "酸っぱい葡萄" と言ふ) peace.2ch.net/test/read.cgi/tech/1345123070/70-71 これが Swift や Ruby 等と比較すると、関数型プログラミングで Python が劣る典型的な一例になる
192 名前:デフォルトの名無しさん mailto:sage [2014/12/10(水) 20:24:01.24 ID:Q728OFWk.net] と言うかどう見てもこないだまでこのスレに居た俺俺定義の人ですな
193 名前:デフォルトの名無しさん mailto:sage [2014/12/10(水) 20:43:29.64 ID:Q728OFWk.net] よく見たら、そのスレで誘導かけてるの、話振ったお前本人じゃねーかw 俺俺定義が認められなかったから逃げて来たのか?
194 名前:デフォルトの名無しさん mailto:sage [2014/12/10(水) 21:30:40.85 ID:AwBDqpLr.net] クロージャの定義は>>4 って書かれてたがStandard MLにラムダ式はない けど当然SMLにはクロージャがあるわけで ソースはThe Definition of Standard ML, revised edition
195 名前:デフォルトの名無しさん mailto:sage [2014/12/10(水) 21:46:37.74 ID:ZY5znPCs.net] 関数型プログラミングってどういうのを指して言ってるんだろ
196 名前:デフォルトの名無しさん mailto:sage [2014/12/10(水) 21:50:32.14 ID:gkNqf6iG.net] >>191 のサンプルが手続き型全開の書き方で笑った >>195 関数(に名前付けたくない)型プログラミング
197 名前:デフォルトの名無しさん mailto:sage [2014/12/11(木) 21:30:20.83 ID:GpAyUabF.net] >>193 Swift スレの質問「Python が Swift や Ruby より劣ってるのは何か」に答えただけ で、具体的に反論できないから罵倒を始めて Swift スレが荒れそうだったから、 こちらへ移動してきた >>194 >>4 の定義において、局所環境やラムダ式は(クロージャという概念の構成要素であるけど)、 一般の言語だと直接的に対応する具象構文として存在していない(自分は知らない) その書籍は読んでいないけど、おそらく Standard ML では "fn" <match> という具象構文を 「関数(function)」または「関数式(function expression)」と呼んでいると思う で >>4 だと、その具象構文 "fn" <match> はクロージャに対応する またクロージャ(日本語では「閉包」)という用語は馴染みづらいので、 クロージャの具象構文を指して(便宜的に)無名関数/匿名関数/ラムダ関数/ラムダ式/関数式 ...etc と 別名で呼ばれることがある: ・Standard ML では、単純に「関数」や「関数式」と呼ぶ ・JavaScript では、"ECMAScript Specification" では(SML と同様に)「FunctionExpression」と呼ばれ、 サイ本では「関数リテラル」と呼ばれている ・13 関数定義 (Function Definition) -- Under Translation of ECMA-262 3rd Edition www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/13_Function_Definition.html ・Python では、その言語リファレンスで「ラムダ式」と呼ばれている: ・6. 式 (expression) ― Python 3.4.2 ドキュメント docs.python.jp/3.4/reference/expressions.html#lambda
198 名前:デフォルトの名無しさん mailto:sage [2014/12/11(木) 21:48:16.84 ID:AENhOzwc.net] >>197 肝心のクロージャの定義の引用はまだですか? 俺俺定義はお腹いっぱいなんですよ
199 名前:デフォルトの名無しさん mailto:sage [2014/12/11(木) 22:44:15.05 ID:GpAyUabF.net] 調べてみると、Python のラムダ式で任意の文が書けないという問題(>>191 )は、 過去に何度もネット上で話題になっていたようだね: ・Is it possible to have multiple statements in a python lambda expression? - Stack Overflow (May 14 '09) stackoverflow.com/questions/862412/is-it-possible-to-have-multiple-statements-in-a-python-lambda-expression ・syntax - No Multiline Lambda in Python: Why not? - Stack Overflow (Aug 5 '09) stackoverflow.com/questions/1233448/no-multiline-lambda-in-python-why-not ・Why doesn't Python allow multi-line lambdas? - Programmers Stack Exchange (Aug 7 '11) programmers.stackexchange.com/questions/99243/why-doesnt-python-allow-multi-line-lambdas そして、この問題を解決すべく数多くの提案が出された: ・AlternateLambdaSyntax - Python Wiki https://wiki.python.org/moin/AlternateLambdaSyntax それら提案の中には、Ruby のブロックを真似しよう(similar to Ruby's blocks)、というものまであった ・[Python-ideas] Proposal for function expressions - Grokbase grokbase.com/t/python/python-ideas/097ccjz2c3/proposal-for-function-expressions しかし残念ながら、これ以上続けても収束しそうもないから議論は打ち切り、とGuido氏が宣言(強権発動?)して終わった ・[Python-Dev] Let's just *keep* lambda https://mail.python.org/pipermail/python-dev/2006-February/060415.html この顛末をGuido氏は「複数行のラムダは解けないパズル(unsolvable puzzle)」と語っている ・Language Design Is Not Just Solving Puzzles www.artima.com/weblogs/viewpost.jsp?thread=147358 まさに「みんなを納得させるほどの「結論」じゃない」というのは、こういう状況を指しているんだろね.... peace.2ch.net/test/read.cgi/tech/1417333026/9