クロージャって何がいいの? [転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2014/11/08(土) 13:11:47.84ID:6V2MLUHb
関数型言語に必ずくっついてるこれ
いらんでしょ?匿名クラスで充分でしょ
2014/11/09(日) 22:05:03.57ID:TZMLlS/6
Java 8のクロージャは「effectively finalに限りキャプチャ可能」
というなんちゃってな局所環境だけどな
effectively finalの導入でかろうじて使い物になるかも知れないレベル
2014/11/09(日) 22:10:31.90ID:KOr7L+hP
>>63
普通は局所変数に代入するだろ、>>52 みたいに
  y = 2 * x
  z = x * y

それとも、Python ではこんな単純な代入文も書かずに(書けずに?)、
わざわざ関数定義するのが当たり前なのかなあ?
2014/11/09(日) 22:13:13.99ID:n2NDOrh4
>>38
…Haskellにはクロージャが無いと?
2014/11/09(日) 22:21:17.10ID:KOr7L+hP
>>68
Yes/No であれば No だ

繰り返しになるけど、
真のクロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々におけるクロージャの定義と、
手続き型言語の Python におけるクロージャの定義は異なっている
Python では識別子に束縛したクロージャ、いわゆる関数しか存在できず、
局所環境を伴うラムダ式を表現できない

このため、>>47 のような
  ラムダ式が入れ子になったカッコだらけ
の汚いコードしか書けない
結果として、Python は関数型プログラミングには不向きである
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)
2014/11/09(日) 22:25:17.72ID:lx9et4kr
>>67
そっちが言う馬鹿(>>72)がいたよ



まさかの同一ID⁉︎
2014/11/09(日) 22:28:55.78ID:GwhuA7Og
>クロージャを識別子に束縛したものが関数だから

C#やECMAScriptの匿名関数は関数ではないと。
珍妙な新説ですなふむふむ
2014/11/09(日) 22:31:31.78ID:KOr7L+hP
>>71
>>38における「値を局所環境に保存」とは、識別子と値の対(ペア)を局所環境に追加すること(>>42 も参照)

ここで、追加の時に既に同じ名前の識別子が存在していた場合、手続き型言語では値を破壊的に更新するけど、
関数型言語では新たに局所環境が生成される(=破壊的に更新しない)点が異なる
ただし、この追加時の振る舞いの差異は、クロージャが存在する/しないとは無関係、ごっちゃにするのは間違い
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)しか書けないから、
常に関数定義で「書かなければならない」という違いがある
2014/11/09(日) 22:46:49.16ID:nlmXbEn2
>>76
お前のオレオレ定義なんて興味ねーんだよ
まずはその珍説が書いてある文献を引用しろ
2014/11/09(日) 22:49:23.73ID:5LKfT6rZ
>>77
>>44
2014/11/09(日) 22:51:44.34ID:lx9et4kr
>>77
関数定義で可読性も簡潔さも失わないから、関数で書ければ良いよ

で、なぜ関数定義でクロージャが作れる
Pythonにクロージャがない事になるの?
>>68にNoと答えて、>>64も否定したよね?
2014/11/09(日) 22:54:09.40ID:nlmXbEn2
>>79
そいつ、関数を定義する特定のシンタックスシュガーに制限があることと
その言語自体が持つ機能との区別が付かない馬鹿だから
2014/11/09(日) 22:56:01.93ID:5LKfT6rZ
でもまあ、pythonの文法が変態なのは間違いない。
2014/11/09(日) 22:56:21.23ID:KOr7L+hP
>>73
ナゼ 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 等々のふつうの言語では、
>>52 みたいなラムダ式だけを使ったコードが何の苦もなく自然に書けるんだから
2014/11/09(日) 22:59:47.88ID:QKkGL4h0
83はキチガイなの?
>>73は明らかに実行時のy,zを取り込んだ関数オブジェクトを生成してるからクロージャだろ
defと書くかlambdaと書くか文法の些細な決まり事などどうでもいい
2014/11/09(日) 23:01:05.93ID:lx9et4kr
>>83
同程度に簡潔に書けるなら、書き方は一つの方が良い
というのがPythonの理想だから
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)
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
>>88
>>73のy, zのどこが引数なんだよ
既知外は黙ってろよ
2014/11/09(日) 23:23:03.86ID:lx9et4kr
>>46の話ならデフォルト引数で値を入れてるから
普通に関数適用で引数に値を入れてるのとは厳密には違うよ?
どうでも良いけどね
2014/11/09(日) 23:26:01.65ID:lx9et4kr
>>86
Pythonにクロージャが無いは嘘ってことね
嘘は良くない
2014/11/09(日) 23:27:54.79ID:KOr7L+hP
>>90
>>88で書いたのは >>41 のラムダ式だけで書かれた Python コードだ
失礼した

>>73 は関数定義でクロージャが作られているね
ただし、Python だけがラムダ式ではクロージャが作られず、
Python におけるクロージャの定義が他の「普通の言語」と異なっている事実に変わりはない
2014/11/09(日) 23:30:45.91ID:nlmXbEn2
>>93
お前は無名関数って何がいいの?スレを立てて、そこで思う存分Pythonのlambdaを罵倒するべき
クロージャ云々は言いたい事と噛み合ってない
2014/11/09(日) 23:33:02.09ID:KOr7L+hP
>>92
Python には真のクロージャが存在しない、という指摘は事実だよ(嘘ではない)

もし「Python にも真のクロージャが存在する」と主張したいのなら、
>>83 のコードが構文エラーとならないように添削しなさい
もし「Python にも真のクロージャが存在する」のなら、たやすい作業のはずだ
真のクロージャを備えた普通の言語では、何の苦も無く >>52 みたいなコードが書けるんだからね

君が嘘つきでなければ、書けるはず
2014/11/09(日) 23:33:22.37ID:5KptUVSU
使い勝手で一番使い物にならないのはJavaだろ?
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行しか書けねえし、
まったく融通がきかねえな!

みたいな字面上の不満であって、関数型プログラミングだのクロージャだの全然関係ない。
2014/11/09(日) 23:36:58.94ID:lx9et4kr
>>95
関数は局所環境持ってても「真のクロージャ」じゃないってこと?
Yes/Noで答えて
2014/11/09(日) 23:39:26.26ID:nlmXbEn2
真のクロージャとかいうオレオレ用語
もちろん引用もなければ定義もない
2014/11/09(日) 23:40:53.08ID:KOr7L+hP
>>94
クロージャという概念を正しく理解していないと、
Python みたいなラムダ式に欠陥のある言語が設計されてしまうというお話だよ
言い換えると、クロージャという概念を用いると、
なぜ Python のラムダ式が欠陥品なのかを明解に説明できる

このクロージャの利点は、このスレの主旨からは逸脱していないと思うよ
2014/11/09(日) 23:42:02.22ID:nlmXbEn2
>>100
お前がこのスレで一番クロージャを理解してない件
構文の字面しか見てないし
2014/11/09(日) 23:57:43.62ID:KOr7L+hP
>>98
No だね

あえていえば「クロージャもどき」とか「なんちゃってクロージャ」だね
真のクロージャであれば無名関数でも間数定義でも作られ、
無名関数であってもクロージャを構成する局所環境を持つことができる
これが、 C#、Java8、C++11、JavaScript、Ruby 等々の
「ふつうの言語」における「ふつうのクロージャ」だ

おそらくクロージャを正しく理解していなかったんだろね、Python 言語設計者達は....
2014/11/09(日) 23:59:39.38ID:yjLcynWs
話をまとめよう

世間一般のクロージャの要件:
 局所環境を持つ(変数を束縛できる)
 関数をインラインで書ける

キチガイのクロージャの要件:
 クソージャの中にクソージャが書ける
 若しくは
 言語設計上の欠陥を見落としたことを認める(>>86の発言)
 のいずれか
2014/11/10(月) 00:08:24.74ID:LMH7nFF4
>>103
添削してあげよう


--
話をまとめよう

世間一般のクロージャの要件(C#、Java8、C++11、JavaScript、Ruby 等々):
 関数であっても無名関数であっても、局所環境を持つ(変数を束縛できる):>>52,56,77

Python に固有なクロージャの要件:
 関数だけが局所環境を持つ(変数を束縛できる):>>73
 無名関数では局所環境を持てない(変数を束縛できない):>>46,83
2014/11/10(月) 00:14:31.96ID:cCGgoLPL
まあここはscheme最強っていう事にしておきますか。
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 は除外するね、自分なら

もし、これが「構文の字面しか見てない」と思えるのなら、それはそれでもいいんじゃないのかもね.....
2014/11/10(月) 00:37:52.21ID:cCGgoLPL
Pythonはlambdaの不便さも含めて構文がアレなので大嫌いだけど、
ライブラリが色々そろってて便利だから結局よく使っているのであった。
2014/11/10(月) 00:42:53.31ID:zIX5GD/A
pythonのlambdaってmapやfilterを追加したときに申し訳程度に付けたって感じ
2014/11/10(月) 02:52:22.03ID:qQmxJFhq
>>106
その文章を書いた人の考えと、君の解釈には随分とズレがあるようだ
2014/11/10(月) 06:04:53.17ID:i3Y7RgoA
馬鹿には無理
2014/11/10(月) 07:14:42.95ID:0mRy26rG
Pythonの不自由さ(関数型のクロージャに近いの)はGuidoの方針じゃないの?
嫌なら、おとなしくジェネレータ使えばいいじゃん。
2014/11/10(月) 08:48:39.72ID:PWSP4TjP
クロージャは何がいいんだよ!
https://i.imgur.com/fTQTEYN.gif
2014/11/10(月) 09:04:03.39ID:HTkQymog
引数に別名付けたくなる程に中身が長いなら
関数にも名前付けろってのがGuidoの方針なんだろ
文法的に拡張可能なのに、あえてリジェクトしてるくらいだし
http://www.artima.com/weblogs/viewpost.jsp?thread=147358
2014/11/10(月) 10:20:30.55ID:CeTPRNSr
>>106
Martin Fowlerは字面だけを見てないから、ちゃんとPythonにもクロージャがあると思ってるよ

お前が張ったリンク先の「他の言語」を見てみろ
1151
垢版 |
2014/11/10(月) 11:39:28.98ID:rdbd3Lyi
何がクロージャかよりどこが好きかでクロージャを語れよ!!(ドンッ
2014/11/10(月) 20:33:09.35ID:AR7BQCkT
クロージャとメソッドで f[x] と f(x) を使い分けなきゃダメなRubyが
一番ウンコだと思う
2014/11/10(月) 20:39:42.07ID:5eyjbk6/
>>116
それはクロージャとメソッドではなく、Procとメソッドだと思う
Rubyのクロージャはブロックのほうの機能と考えたほうが良いんじゃないかな
118デフォルトの名無しさん
垢版 |
2014/11/10(月) 21:34:09.37ID:Xzn5T3EF
>>115

俺の財宝か?欲しけりゃくれてやる。
探せ!この世の全てをそこに置いてきた。
2014/11/10(月) 22:47:25.14ID:oQ75X8QG
文系出身プログラマ「クロージャ?なにそれ?服入れるとこ??」
ってやつに対してドヤ顔ができる
2014/11/11(火) 06:32:45.68ID:G8l0apNf
クロー系の最強魔法です 消費MP60
121118
垢版 |
2014/11/11(火) 21:00:28.44ID:UknPa1bY
レスお願いします
2014/11/11(火) 22:06:02.40ID:3gT2I0NB
若い時に買ってでもすることは?

苦労じゃ!くろうじゃ!クロージャ!
2014/11/12(水) 01:25:01.41ID:G1/eYMX4
クロージャの良さを、クロージャを使うことで劇的に
簡潔になる例を使って説明してください
2014/11/12(水) 07:27:28.43ID:ptlTHlgg
コールバック関数を別途書かなくて良くなります。
もしコールバック関数の為だけにインスタンス変数を定義していたなら、
それも必要が無くなります。

消費MP 5
2014/11/12(水) 08:10:30.04ID:G1/eYMX4
コールバック関数地獄のJSのコードは
可読性が悪い上に簡潔でも無いので、失格です
2014/11/12(水) 08:13:15.39ID:/hly7+iy
オールバックって額からハゲるだろ?
2014/11/12(水) 08:27:11.27ID:cKuXIrT/
>>125
そんなあなたにClojureScript。
core.asyncのチャネルでスッキリしますよ(Go由来のようだけど)
2014/11/12(水) 20:27:05.24ID:3VJGATlA
>>127
コールバック自体がダメなんだよ。
例えば、addEventLisnerの引数にコールバックを指定する。
これだけでも可読性悪いだろ。
2014/11/12(水) 20:37:53.49ID:L8labB6g
見慣れてるかどうかだと思うけどな
2014/11/12(水) 20:38:24.71ID:5GyhUZuz
>>128
代案も出さずに批判だけするなら、幼稚園児にだってできるよ
2014/11/12(水) 20:52:00.80ID:UPi6O5bX
リスナーI/Fをインプリメントしたオブジェクト渡せばいいのでは
2014/11/12(水) 21:14:25.68ID:ptlTHlgg
それではそのオブジェクトを定義しなくてはならなくなります。
クロージャはそのようなデリゲートオブジェクトやコールバックパターンからの解放なのです。

消費MP 12
2014/11/12(水) 21:16:45.87ID:eep146vT
JavaScript(だけに限らないが)
クロージャーが見難いんじゃなくて
非同期の入れ子が見にくいんだろ。
で、それを解決するライブラリが存在する。

結局のところ、そのライブラリ
Promiseとかを使えば解決する問題。
2014/11/12(水) 21:23:36.45ID:G1/eYMX4
結局のところ、コールバックはクロージャのメリットじゃないんですね?
もっと良い方法があるのですから
2014/11/12(水) 21:36:55.56ID:ptlTHlgg
いや、クロージャ使ってそのスコープで解決しちゃえばコールバック関数要らないって話なんだが。
2014/11/12(水) 21:59:20.14ID:G1/eYMX4
Haskellのdo記法みたいなのがあれば
クロージャをチェインしていっても読み難くならないという話ですか?
2014/11/12(水) 22:58:17.02ID:L8labB6g
小規模なコールバックだったらインラインで書いた方が見通しが良いだろうし、
複雑なのだったら分けて書いた方が理解しやすいだろうし、
あれが最強他はゴミとか言ってるのが一番ダメなんじゃね?
2014/11/15(土) 12:17:49.98ID:uUcubJGq
結局クロージャの利点てコールバックが楽にかけるってだけ?
ならクロージャや匿名オブジェクトじゃなくて匿名メソッドが書ければ充分だな
2014/11/15(土) 12:25:31.04ID:u4ZMuG60
楽に書けるって事じゃなくて、そのスコープで完結できるって事じゃね?
2014/11/15(土) 12:56:58.32ID:XlhMXrhL
とりあえずコードで語れば?
大規模開発でメリットが出てくるとかの話じゃないんだし
2014/11/15(土) 14:40:16.71ID:EFct/v5k
見た目的にも変数の値の可視性的にもそこのスコープってとこが楽だよね
2014/11/15(土) 14:43:26.00ID:XlhMXrhL
つまりインラインでクラス定義できるのでも良いわけだよね
2014/11/15(土) 15:14:55.72ID:EFct/v5k
>>142
本来そうだけど 、
シンタックスはインラインだけど実際はただの内部クラスで、
生成時の環境を一切利用できない言語もあるから何とも言えない。

クロージャの代わりにクラスを用いると何となくそういう実装になる。
ローカル環境の代わりにインスタンス変数を用いる方向にいくから。


FILE *fp = fopen(..);
doHoge( ^(const char*msg){ fputs(msg,fp); });
fclose(fp);

みたいに簡便にクロージャ生成時の外部の変数(の値のコピー)を
保持し使用できるクロージャとは方向性が違う。

ローカルメソッドに至っては環境が一昨渡せない
シングルスレッド前提ならグローバル変数を使えばいいわけだけど
2014/11/15(土) 15:54:48.49ID:uUcubJGq
(擬似言語)
fw = new FileWriter();
doHoge( fw.witer );
fw.close();
こんなのをワンラインで書ければ満足なんだろ?匿名メソッドで十分じゃない
2014/11/15(土) 15:58:46.71ID:EFct/v5k
>>144
じゃ匿名メソッドで書いてごらんよ
2014/11/15(土) 23:46:47.75ID:JsFAZjCZ
with (fw, new FileWriter()) {
doHoge(fw.witer);
}
こうやって書けるほうがいい
2014/11/16(日) 10:37:06.14ID:ZMiOBdAw
じゃあこれは?

FILE *fp = fopen(..);
doHoge( ^(const char*msg){ fprintf(fp, "Hoge: %s\n", msg); });
fclose(fp);
2014/11/16(日) 11:54:54.13ID:fx2XWh+X
>>146
もはや匿名メソッドすら要らない派が出てくるしww
2014/11/18(火) 16:33:41.48ID:cuxiU0eb
Java8すら使わせてもらえない人が必死なスレにしか見えなくなってきた
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 に分類されている
2014/11/19(水) 23:00:05.80ID:074lLX1H
クロージャばりばり使うlisp方言でもwith構文は使うよ
2014/11/19(水) 23:12:18.42ID:3WdraWBV
クロージャとクリーンアップ処理とは別の話じゃないの?
2014/11/19(水) 23:33:41.68ID:PA9iCB5s
Pythonが憎すぎて既知外になった人の相手をしちゃいけません
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になってるわけじゃない

お前、ほんと、馬鹿だよね?
2014/11/19(水) 23:57:41.67ID:eeZRz+g3
クロージャと with 構文のどちらも持っている言語であれば、
ケースバイケースで可読性や好みで使い分ければいいのではないかと

問題はクロージャを持たない、あるいは
「世間一般のクロージャの要件(>>104)」を満たせない言語では、
with 構文という(クロージャと比べて)不自由な代用品を使わざるをえない
という話
2014/11/20(木) 00:02:30.91ID:fhZ8V3Hu
>>150>>155
下の(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って字面だけ見て同じだと思っちゃったの?
そんなだから構文の字面しか見てない馬鹿って言われちゃうんだよ
2014/11/20(木) 00:19:03.39ID:wJ3BgpRF
>>154
>ここで言ってるwithは例外が起きた時にリソースを解放する機能を持ったもの。

わざわざ with という構文を追加して言語の意味論を複雑にしなくても、
もし汎用的な概念であるクロージャがあれば、同じ事を実現できるってことだよ

もし Python にもクロージャがあるなら、他の言語達と同様に
with 構文を使わなくてもリソースの自動解放を簡潔に表現できるハズだけど、
手続き型言語の Python では無理だろうね

それとも、書けるかな?
2014/11/20(木) 00:20:15.54ID:7GcQ+ika
pythonでも引数にクロージャ受け取ってwithの中でそれを実行する関数つくれば、rubyのそれと等価じゃね?
pythonはlambdaが制限きついから複雑な処理はインラインには書けないけど。
2014/11/20(木) 00:29:37.23ID:wJ3BgpRF
>>158
>それを実行する関数つくれば、

もし Python が「世間一般のクロージャの要件(>>104)」を満たしていれば、
「関数をつくらなくても」クロージャだけで簡潔に書けるはず
つまり「関数をつくらなければ書けない」ということは、
Python が「世間一般のクロージャの要件」を満たしていないことを認めたってこと
2014/11/20(木) 00:36:40.77ID:ri7Qzvfi
「世間一般のクロージャの要件」が
全然世間一般の定義じゃない件
2014/11/20(木) 00:37:00.07ID:7GcQ+ika
>>159
def make_f(x):
 def f(y):
  return x * y
 return f

例えばこんなのがあったとして、このmake_f()が返すものは何?
2014/11/20(木) 00:42:39.12ID:wJ3BgpRF
>>161
「クロージャみたいなモノ」もしくは「クロージャもどき」

def make_f(x):
 return lambda(y): x * y

が返すのも同じ
2014/11/20(木) 00:44:55.24ID:7GcQ+ika
>>162
「クロージャみたいなモノ」もしくは「クロージャもどき」と、クロージャの違いは何?
2014/11/20(木) 00:45:40.70ID:ri7Qzvfi
>>162
>>31の定義だと完璧にクロージャの条件を満たしてるけど?

君はどこのローカルルールの話をしてるの?
2014/11/20(木) 00:47:27.27ID:wJ3BgpRF
>>163
>>104
2014/11/20(木) 00:52:13.60ID:7GcQ+ika
>>165
>世間一般のクロージャの要件(C#、Java8、C++11、JavaScript、Ruby 等々):
>  関数であっても無名関数であっても、局所環境を持つ(変数を束縛できる):>>52,56,77

>>161のmake_f()が返すものは局所環境をもってるし名前も付いてないよ。
2014/11/20(木) 00:58:03.79ID:wJ3BgpRF
>>164
いや、Python は関数を定義しなければ局所環境が作られないんだから、
>>31 の要件は満たしていないだろ
>>31 には「ラムダ式や無名関数で実現している」と書かれているんだけど、
日本語が不自由なんですか?

実際、もしも >>31 の定義を満たしているなら、
>>46 のゴチャゴチャしたコードは
(>>73 のようにわざわざ関数を定義しなくても)
>>83 のように「ラムダ式や無名関数で実現している」
簡潔なコードに書き直せるはずだ

さて、論よりコード、>>164 は書き直せるかな?
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
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況