- 1 名前:デフォルトの名無しさん [2014/11/08(土) 13:11:47.84 ID:6V2MLUHb.net]
- 関数型言語に必ずくっついてるこれ
いらんでしょ?匿名クラスで充分でしょ
- 51 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 20:40:33.21 ID:lx9et4kr.net]
- >>48
Pythonのラムダ式では局所変数に再束縛できない、は間違い(>>47) 嘘は良くない
- 52 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 20:49:43.56 ID:lx9et4kr.net]
- >>45
そうだよ
- 53 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 21:05:06.25 ID:KOr7L+hP.net]
- >>48
クロージャを備えた言語であれば、ラムダ式を入れ子にした複雑なコードを書かなくても、 単純明瞭で可読性の高いコードが書ける 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 との違い
- 54 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 21:08:04.55 ID:lx9et4kr.net]
- ラムダ式の入れ子は分かりにくいから
関数型プログラミングに向いてない 関数型とは一体…
- 55 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 21:09:53.89 ID:5LKfT6rZ.net]
- そもそも関数型プログラミングって堂々と代入してるようじゃダメなのでは
- 56 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 21:12:20.49 ID:lx9et4kr.net]
- どれだけ間違いを指摘しても
Pythonにクロージャが無いって意見を上書きできない これが参照透過性です
- 57 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 21:14:02.40 ID:KOr7L+hP.net]
- (>>53 の続き)
もちろん関数型言語であれば、>>53 の JavaScript より更に簡潔になるのは当たり前の話 以下は Standard ML val f = fn x => let val y = 2 * x val z = x * y in fn w => w * (y + z) end val g = f 2 g 3
- 58 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 21:18:46.76 ID:KOr7L+hP.net]
- >>54
>ラムダ式の入れ子は分かりにくいから >関数型プログラミングに向いてない 添削しよう: ラムダ式の入れ子は分かりにくいから、 ラムダ式の入れ子や関数内関数を多用しなければならない手続き型言語の Python は 関数型プログラミングに向いてない それに対して、クロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々の普通の言語では、 クロージャ自身が持つ局所環境内の変数に代入(=束縛)できるから、 関数型プログラミングに向いている
- 59 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 21:25:01.25 ID:KOr7L+hP.net]
- >>51
Python ができるのは、引数に再束縛することだけ 局所変数(>>53,56 の y と z)には代入できない Python でも「ラムダ式では局所変数に再束縛できる」と主張したいのなら、 ラムダ式の入れ子や関数内関数を使わずに、可読性の悪い >>48 のコードを書き直しなさい もし Python に真のクロージャが存在するのなら、簡単な仕事のはずだ できるよね? できないのなら、嘘つきは君のほうだよ
- 60 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 21:31:21.14 ID:lx9et4kr.net]
- 変数に再束縛できないから、変数に代入できないに意見が変わったね
やっと>>31に追いついたね
- 61 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 21:36:16.07 ID:lx9et4kr.net]
- >>47の変数は外から見えないという意味で
紛れもなく局所変数
- 62 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 21:41:46.54 ID:LUEi6lWE.net]
- Java 8にクロージャなんかあったっけ?
ただのラムダだったような
- 63 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 21:44:14.34 ID:KOr7L+hP.net]
- >>60,60
ぐだぐだ屁理屈を言うより、さっさと >>48 のコードを書き直した方がいいんじゃね? それとも Python コミュニティでは >>48 みたいな ラムダ式を入れ子にしたカッコだらけ のコードが可読性のある美しいコードなのかなあ 自分には、>>53,56 のほうが可読性の高いコードだと思うけどね
- 64 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 21:45:18.38 ID:lx9et4kr.net]
- 普通は関数定義するよ
当たり前じゃん
- 65 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 21:49:19.33 ID:lx9et4kr.net]
- ところで関数はクロージャじゃないって
どこの文化なの? 聞いたことない
- 66 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 21:50:58.85 ID:KOr7L+hP.net]
- >>62
>>4 で書いたように、クロージャは抽象的な概念だよ 言語の意味論を定義したり言語処理系を設計する時に用いられる抽象構文で現れる この抽象構文上のクロージャは、具象構文では一般にラムダ式とか無名関数(匿名関数)と呼ばれる たとえば Java 8 のラムダ式がそうだし、JavaScript の具象構文では function() { .... } と書き、 Standard ML では fn <id> => <expr> という具象構文で表現される
- 67 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 21:55:24.38 ID:lx9et4kr.net]
- 言語的にはJavaのラムダは
ただのメソッド一つのクラスだよ
- 68 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 21:58:19.30 ID:KOr7L+hP.net]
- >>65
自分も聞いたことないね そんなこと言ってるお馬鹿さんはいるのかな? まあ正確に言うと、クロージャを識別子に束縛したものが関数だから、 束縛されていない無名関数(=ラムダ式)と区別することが必要な文脈もあるけどね(>>4)
- 69 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 22:04:34.10 ID:lx9et4kr.net]
- >>68
じゃあPythonにクロージャはあるの? Yes/Noで答えて
- 70 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 22:05:03.57 ID:TZMLlS/6.net]
- Java 8のクロージャは「effectively finalに限りキャプチャ可能」
というなんちゃってな局所環境だけどな effectively finalの導入でかろうじて使い物になるかも知れないレベル
- 71 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 22:10:31.90 ID:KOr7L+hP.net]
- >>64
普通は局所変数に代入するだろ、>>53 みたいに y = 2 * x z = x * y それとも、Python ではこんな単純な代入文も書かずに(書けずに?)、 わざわざ関数定義するのが当たり前なのかなあ?
- 72 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 22:13:13.99 ID:n2NDOrh4.net]
- >>39
…Haskellにはクロージャが無いと?
- 73 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 22:21:17.10 ID:KOr7L+hP.net]
- >>69
Yes/No であれば No だ 繰り返しになるけど、 真のクロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々におけるクロージャの定義と、 手続き型言語の Python におけるクロージャの定義は異なっている Python では識別子に束縛したクロージャ、いわゆる関数しか存在できず、 局所環境を伴うラムダ式を表現できない このため、>>48 のような ラムダ式が入れ子になったカッコだらけ の汚いコードしか書けない 結果として、Python は関数型プログラミングには不向きである
- 74 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 22:21:52.15 ID:lx9et4kr.net]
- >>71
だから普通はこう書くよ あれ?一番簡潔になった? def f(x): y = 2 * x z = x * y return lambda w: w * (y + z) g = f(2) g(3)
- 75 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 22:25:17.72 ID:lx9et4kr.net]
- >>68
そっちが言う馬鹿(>>73)がいたよ まさかの同一ID⁉︎
- 76 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 22:28:55.78 ID:GwhuA7Og.net]
- >クロージャを識別子に束縛したものが関数だから
C#やECMAScriptの匿名関数は関数ではないと。 珍妙な新説ですなふむふむ
- 77 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 22:31:31.78 ID:KOr7L+hP.net]
- >>72
>>39における「値を局所環境に保存」とは、識別子と値の対(ペア)を局所環境に追加すること(>>43 も参照) ここで、追加の時に既に同じ名前の識別子が存在していた場合、手続き型言語では値を破壊的に更新するけど、 関数型言語では新たに局所環境が生成される(=破壊的に更新しない)点が異なる ただし、この追加時の振る舞いの差異は、クロージャが存在する/しないとは無関係、ごっちゃにするのは間違い
- 78 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 22:45:45.31 ID:KOr7L+hP.net]
- >>74
たとえば JavaScript なら、ラムダ式だけ(>>53)と関数定義との併用、 それらのどちらでも簡潔なコードが書けるよ 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 だとラムダ式だけでは「入れ子になったカッコだらけ」の汚いコード(>>48)しか書けないから、 常に関数定義で「書かなければならない」という違いがある
- 79 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 22:46:49.16 ID:nlmXbEn2.net]
- >>77
お前のオレオレ定義なんて興味ねーんだよ まずはその珍説が書いてある文献を引用しろ
- 80 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 22:49:23.73 ID:5LKfT6rZ.net]
- >>78
>>45
- 81 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 22:51:44.34 ID:lx9et4kr.net]
- >>78
関数定義で可読性も簡潔さも失わないから、関数で書ければ良いよ で、なぜ関数定義でクロージャが作れる Pythonにクロージャがない事になるの? >>69にNoと答えて、>>65も否定したよね?
- 82 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 22:54:09.40 ID:nlmXbEn2.net]
- >>80
そいつ、関数を定義する特定のシンタックスシュガーに制限があることと その言語自体が持つ機能との区別が付かない馬鹿だから
- 83 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 22:56:01.93 ID:5LKfT6rZ.net]
- でもまあ、pythonの文法が変態なのは間違いない。
- 84 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 22:56:21.23 ID:KOr7L+hP.net]
- >>74
ナゼ Python では、以下のような簡潔なコードが構文エラーになるんだろうね? f = lambda x: y = 2 * x z = x * y return lambda w: w * (y + z) g = f(2) g(3) これじゃあ「Python は関数型プログラミングに向かない」と評価されてもしかたないよね だって、真のクロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々のふつうの言語では、 >>53 みたいなラムダ式だけを使ったコードが何の苦もなく自然に書けるんだから
- 85 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 22:59:47.88 ID:QKkGL4h0.net]
- 83はキチガイなの?
>>74は明らかに実行時のy,zを取り込んだ関数オブジェクトを生成してるからクロージャだろ defと書くかlambdaと書くか文法の些細な決まり事などどうでもいい
- 86 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 23:01:05.93 ID:lx9et4kr.net]
- >>84
同程度に簡潔に書けるなら、書き方は一つの方が良い というのがPythonの理想だから
- 87 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 23:08:28.24 ID:KOr7L+hP.net]
- >>81
>で、なぜ関数定義でクロージャが作れる >Pythonにクロージャがない事になるの? >>73 で書いたように、真のクロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々の ふつうの言語では(関数定義だけではなく)ラムダ式でもクロージャが作られるという違いがあるからだ 対して、Python のラムダ式ではクロージャが作られない(だから、局所変数へ値を代入できない) もし「Pythonにクロージャがない」という主張が不適切であるのならば、 >>43 の最後で書いたように、 「Python の言語設計者達は、処理系への実装を失敗した、あるいは言語設計上の欠陥を見落とした」 と言い換えてもいいよ こんな使い物にならないラムダ式で満足しなければならないとは、最大の被害者は Python プログラマだよね だって、他のふつうの言語であれば「ふつうに書ける」ことが、Python じゃ「書けない」のだから....(>>84)
- 88 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 23:13:26.40 ID:5LKfT6rZ.net]
- ラムダ式の構文が残念だと言いたいなら、最初からそう言えばいいじゃん。
- 89 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 23:16:00.89 ID:KOr7L+hP.net]
- >>85
ラムダ式が引数に値を束縛できるのは、関数型言語を知っていれば常識だよ そんなことも知らないの? で、引数以外の局所変数に値を束縛するには、純粋なラムダ式に加えてクロージャが必要になるって話だよ
- 90 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 23:18:21.66 ID:G8K4RNhm.net]
- >ラムダ式が引数に値を束縛できるのは
それ束縛じゃねーだろ キミはアホなのか?
- 91 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 23:18:59.88 ID:nlmXbEn2.net]
- >>89
>>74のy, zのどこが引数なんだよ 既知外は黙ってろよ
- 92 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 23:23:03.86 ID:lx9et4kr.net]
- >>47の話ならデフォルト引数で値を入れてるから
普通に関数適用で引数に値を入れてるのとは厳密には違うよ? どうでも良いけどね
- 93 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 23:26:01.65 ID:lx9et4kr.net]
- >>87
Pythonにクロージャが無いは嘘ってことね 嘘は良くない
- 94 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 23:27:54.79 ID:KOr7L+hP.net]
- >>91
>>89で書いたのは >>42 のラムダ式だけで書かれた Python コードだ 失礼した >>74 は関数定義でクロージャが作られているね ただし、Python だけがラムダ式ではクロージャが作られず、 Python におけるクロージャの定義が他の「普通の言語」と異なっている事実に変わりはない
- 95 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 23:30:45.91 ID:nlmXbEn2.net]
- >>94
お前は無名関数って何がいいの?スレを立てて、そこで思う存分Pythonのlambdaを罵倒するべき クロージャ云々は言いたい事と噛み合ってない
- 96 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 23:33:02.09 ID:KOr7L+hP.net]
- >>93
Python には真のクロージャが存在しない、という指摘は事実だよ(嘘ではない) もし「Python にも真のクロージャが存在する」と主張したいのなら、 >>84 のコードが構文エラーとならないように添削しなさい もし「Python にも真のクロージャが存在する」のなら、たやすい作業のはずだ 真のクロージャを備えた普通の言語では、何の苦も無く >>53 みたいなコードが書けるんだからね 君が嘘つきでなければ、書けるはず
- 97 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 23:33:22.37 ID:5KptUVSU.net]
- 使い勝手で一番使い物にならないのはJavaだろ?
void m() { int y = f(); y = y + 1; new Thread( () -> {ここでyを使えないKUSO言語} ); }
- 98 名前:デフォルトの名無しさん mailto:sage [2014/11/09(日) 23:33:25.09 ID:5LKfT6rZ.net]
- ID:KOr7L+hP が言ってるのは、
関数の引数にもう少し複雑な処理をインラインで書きたいのに、 defは値返さねえし、lambdaは1行しか書けねえし、 まったく融通がきかねえな! みたいな字面上の不満であって、関数型プログラミングだのクロージャだの全然関係ない。
- 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すら使わせてもらえない人が必死なスレにしか見えなくなってきた
|

|