1 名前:uy [2012/08/11(土) 12:21:25.19 ] 面白かったのでコピペ 979 名前:uy[sage] 投稿日:2012/08/11(土) 11:53:55.80 面接官「特技はRubyとありますが?」 学生 「はい。Rubyでならなんでもかけます。」 面接官「ではシングルトンパターンを書いてください。」 学生 「存在しません?」 面接官「え、存在しない?」 学生 「はい。存在しません。Rubyはシングルトンパターンを言語でサポートしています。」 面接官「・・・で、その言語でサポートされた機能を使うとシングルトンパターンになるんですよね?」 学生 「はい。シングルトンパターンです。」 面接官「いや、あなたRubyでシングルトンパターンは存在しないといいましたよね。なぜシングルトンパターンになるんですか?」 学生 「でも、シングルトンパターンは存在しないんですよ。」 面接官「いや、存在しないとか問題じゃなくてですね・・・」 学生 「Rubyなら簡単にシングルトンパターン書けますよ。」 面接官「ふざけないでください。それに機能が用意されてるってことは存在するでしょ。だいたい・・・」 学生 「機能は用意されていますが言語でサポートしているんです。だから存在しません。」 面接官「聞いてません。帰って下さい。」 学生 「あれあれ?怒らせていいんですか?シングルトンパターン書きますよ。」 面接官「いいですよ。書いてください。Rubyでシングルトンパターンを。それで満足したら帰って下さい。」 学生 「運がよかったな。Rubyにシングルトンパターンは存在しないようだ。」 面接官「帰れよ。」
178 名前:uy mailto:sage [2012/08/15(水) 18:46:19.62 ] はーーー ばぐった Rubyごみかす
179 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 18:46:32.63 ] 短くて分かりやすいのがベストだよね!
180 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 18:58:34.52 ] Smalltalkの #(1 2 3) collect: [:x | x*2] って書き方をパクってこなければ どっちかっていうとPythonっぽいこっちの文法のままだったんだろうな。きっと。 do [1,2,3].map using x; x*2 end
181 名前:153 mailto:sage [2012/08/15(水) 19:14:29.25 ] >>177 一時変数は悪ではないし、否定しないよ 実際に実用的なプログラムでは、あまりに長いメソッドチェーンを 途中で切って、間に一時変数を入れることがある ただし、一度代入したら二度と更新しない 問題は変数の「破壊的代入」 たとえば>>162 の最後にあるforを使った手続き型スタイルでは、 最初にリスト変数とループ変数に初期値を代入した後、 forループ内でこれら変数をゴリゴリと更新(破壊的に代入)している これが可読性の悪化とコード品質の低下をまねく要因 なお破壊的代入の無さは、専門用語だと「参照透明性」と呼ばれる
182 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 19:25:04.95 ] 破壊代入が嫌いなら、手続き型言語の世界から去ってもらうしかないね。 表面のコードに表れて無いだけで、結局mapの中で破壊代入しているのだから、一緒だよ。 書いてある場所が違うだけで、本質的な動作が同じなのだから、危険度も同じ。
183 名前:uy mailto:sage [2012/08/15(水) 19:34:44.27 ] ライブラリや言語処理系側に破壊的操作をさせるのと、 自分で直に破壊的操作を行う処理を書くのは全然危険度が違うよ
184 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 19:39:26.70 ] だったら、関数型言語の参照透過性のメリットなど何も無いって事だな。 破壊的代入は全てライブラリにやってもらえば安全なのだから。
185 名前:uy mailto:sage [2012/08/15(水) 19:43:25.26 ] 頭悪いね
186 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 19:45:30.24 ] >>114 ブロック内の処理が一つの場合は{}で複数処理はdo end がいいってじっちゃが言ってた
187 名前:uy [2012/08/15(水) 20:20:56.63 ] 長く書くとわかりやすいって考える奴居るよなw 数学でも長い式を 一時変数に代入するのにな。
188 名前:デフォルトの名無しさん [2012/08/15(水) 20:22:00.55 ] do | o | ってやったら外人に笑われた なんで?
189 名前:uy mailto:sage [2012/08/15(水) 20:38:54.52 ] キチガイなんじゃね
190 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 21:01:43.68 ] >>188 lolはlaugh out loudlyで(笑)と同じように使われるから、笑えよってことだね。英語圏のコミュニティ行くとよくあるよ。
191 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 21:10:40.01 ] 内包表記が読み難いとか言ってる奴は 数学の素養が無いって自己紹介してることに気付いてないの? かっこわるいから控えた方が良いよ
192 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 21:13:01.31 ] 集合のアレだと気づくのに半年かかったお
193 名前:uy [2012/08/15(水) 21:19:39.91 ] >>191 でも、実際に読みづらいんだろう?
194 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 21:27:25.15 ] ブロック記法は任意の(ただし関数引数は一つだけの) 高階関数を記述できる分だけ汎用性があるが、 mapとかfilterとかの組み合わせに関してはリスト内包表記のほうが簡潔になりうる 細かい優劣はあれど、matzは内包表記みたいな専用構文を用意するのを嫌った PythonあるいはHaskellその他のように、頻出する記述に糖衣構文を与えるのは間違っていないと思うが、 Rubyはそれよりもブロック構文による均質性を採ったという事
195 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 21:40:16.38 ] なんでSmalltlakみたく{ |x| x*2 } をファーストクラスにしなかったの? そしたらもっと簡潔にも均質にもなったのに。
196 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 21:50:52.54 ] Pythonの内包表記はプログラミング独特の手続き的なところをない交ぜにしてるから 数学の内包表記は読みやすいからPythonのも読みやすいみたいな論法はちょっとしっくり来ないな
197 名前:153 mailto:sage [2012/08/15(水) 21:57:54.67 ] >>191 自分は内包表記が読み難いとは思わないね ただしPythonの場合、局所宣言またはクロージャがないから せっかくの内包表記構文が台無しになっている 過去スレ19,20で議論になったコードを以下に示す ==== Haskell ==== data Option a = None | Some a ys = [fn x | x <- xs] where fn x = let h = if is_first_page x then generate_header else None b = generate_body x f = if is_last_page x then generate_footer else None in (h, b, f) Haskellには局所宣言としてwhere節があるから、関数fnを定義することで 内包表記を含む式をトップダウンに数学っぽく記述できる ==== Python ==== ys = (Document.new(h,b,f) for x in xs for h in [generate_header() if x.is_first_page else None] for b in [generate_body(x)] for f in [generate_footer() if x.is_last_page else None]) このPythonコードが何をしているかどうか、はたして一目で把握できるかな?
198 名前:153 mailto:sage [2012/08/15(水) 22:01:18.03 ] 参考として、>>197 に関するRubyのコードを過去スレからコピペする ==== Ruby ==== ys = xs.map { |x| h = if x.first_page? then generate_header else nil end b = generate_body x f = if x.last_page? then generate_footer else nil end Document.new h, b, f } Rubyには内包表記構文は無いけれど、普通に書ける(実に初歩的なコードだ)
199 名前:uy mailto:sage [2012/08/15(水) 22:05:42.94 ] いやそこは h = generate_header if x.first_page? b = generate_body x f = generate_footer if x.last_page? だろ falseだろうとローカル変数は宣言されるから
200 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:07:42.58 ] >>197 HaskellもPythonも使えるから どっちも楽勝で読める あとHaskellならそのケースだと内包表記じゃなくて map fn xs だな 短いし読み易い
201 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:08:07.08 ] >>195 確かGroobyはそういう仕様だったから、整合性は何とかなるんだろうけど 実際問題として誰も困ってないんじゃないの ブロックがリテラルとして書けたとしても、どっちみちブロック付きメソッド呼び出しの時は ブロックを特別扱いする構文を認めることになるから、特段簡潔になるというほどでも…… いわゆる無名関数を直接操作したいならブロック(Procオブジェクト)ではなくてlambdaが適当で lambdaに関しては1.9から糖衣構文が入った
202 名前:uy mailto:sage [2012/08/15(水) 22:09:14.11 ] Rubyは色々考えながら作っていってる感はあるよね 現在のrubyに>>197 こういうの導入すれば、開発効率は一時的に上がるけど 低脳プログラマは優秀なプログラマが管理してやらないと 意味不明なコード書いて自滅するから 全体パフォーマンスを見れば入れるべきでないものもある
203 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:13:47.89 ] >>197 どっちにしても、酷いコードだ。
204 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:16:27.85 ] メソッドチェインって書いた後から付け足す事って結構あるからね イテレータやループの書き方は統一されてたほうが良い
205 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:17:50.65 ] この辺りはある程度個人の感性だけど 内包表記が多段ネストし始めるのはさすがに勘弁して下さいっていうか 読むのも書くのも面倒じゃない? Haskellはまだwhere節で後ろに押しこみ直すことでトップダウンに読めるから 場合によっては許せるかなあと。少なくとも適切な変数名が条件w
206 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:22:51.19 ] 内包表記が活きるのはイテレートする変数が 複数になったときじゃねーの f n = [(x,y,z) | x <- [1..n], y <- [1..n], z <- [1..n], x^2 + y^2 == z^2]
207 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:31:21.07 ] >>201 どうして? ブロックがファーストクラスなら yield や &block なんて小細工いらなくなるし、 複数のブロックを引数として簡単に渡せるから表現の幅も広がるし、 機能も意味もずっと簡潔になると思うよ。
208 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:32:31.13 ] 内包表記とか参考演算子なみのウンコやん。 Pythonってそんな誰得非効率機能が特徴なの?ウンコやん。 ついでにRubyもウンコやん。 ラムダ式とかevalが使えんコンパイル言語がなんちゃってevalを実装してるようにしか見えん。ウンコやん。
209 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:42:15.44 ] >>207 もっと具体的に実現例を出してもらわないと よく分からない
210 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:48:10.24 ] とりあえずsmalltalkは演算子優先順位すらないクソ言語だから このスレで議論する価値無い Java以下のウンコの中のウンコ
211 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:52:50.85 ] >>197 をPythonで(RubyやHaskellのコード相当で)書くならごく素直に def preprocess(x): h = generate_header() if x.is_first_page else None b = generate_body(x) f = generate_fotter() if x.is_last_page else None return h, b, f ys = [Document(preprocess(x)) for x in xs] じゃないかと。まずリスト内包で書くことはない
212 名前:uy mailto:sage [2012/08/15(水) 22:53:01.74 ] 初心者は消えろ
213 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 23:10:42.33 ] みんな消えたか…
214 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 23:59:55.09 ] >>209 - 複数のブロックをとるメソッド呼び出しを簡潔に書ける [1,2,3].find(lambda{ :not_found }){ |e| e>5 } [1,2,3].find { :not_found }, { |e| e>5 } - ブロックをレシーバーにできる lambda{ :do_something }.should_not raise_error { :do_something }.should_not raise_error - ブロックをとるメソッドの仮引数に前置&が不要になる def meth(&block); other(&block) end def meth(block); other(block) end
215 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 00:05:36.35 ] -> をタイプする手間すら億劫っていうのは ちょっと病気ですよ Rubyってそういう言語かもしれないけど
216 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 00:06:27.09 ] >>204 付け足す事もあるけど、途中の処理の内容を変えたり、途中で処理を分岐する事もあるよね?その場合、一時変数を使ってる方がやりやすくない?
217 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 00:11:36.22 ] >>143 Perl代替で一番成功してるのはPythonじゃない? Rubyの場合、作者の思惑はともかく、現状はほぼRails専用と言っていいのでは。 Railsを便利に使うためのツールはいろいろあるけど、OSだったりミドルウェアから使うようなRuby製のツールってPerlやPythonと比べて全然無いでしょう。
218 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 00:18:16.38 ] >>214 >- 複数のブロックをとるメソッド呼び出しを簡潔に書ける そういう部分でメソッド引数括弧の省略を使うのは筋悪でしょ 現在のRubyのコーディングスタイルでも、引数がある場合は原則省略しないのが主流 あるいは括弧を省略しない場合、確かにルールは単純だけど見栄えがよろしくない hoge({|x| p x }) そしてブロック構文の仮定として 大部分の高階関数は関数引数を一つしか取らないという 観察結果があるわけだから、一つに特化した構文でも十分
219 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 00:35:02.92 ] >>217 ここで小物と表現していたのは、ツールと呼ぶのもおこがましいほど小さい 日常の雑務を処理するような小規模スクリプトだよ。ワンライナーも含む 例えばRubyに大量に残ってるPerl譲りの特殊変数とか、 外部コマンドのためにリテラルとか、インタプリタの変な起動引数とか、 色々あるが、おそらく全部そういう小物のためのもの
220 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 00:43:48.75 ] >>218 しかし関数型言語で圧倒的に利用頻度の高い 関数合成は関数引数を複数取る関数なんだよね (.) :: (b -> c) -> (a -> b) -> a -> c Rubyではブロックとブロックを合成して 新しいブロックを作りたくなることは無いの? xs.map(f).map(g).map(h) を xs.map(f.g.h) と書けたら良いと思わない?
221 名前:uy mailto:sage [2012/08/16(木) 01:00:12.30 ] 俺はrubi使いだけど、ちょっとrubyの考えは改めようかな 言語が複雑なことやってるから、実装もバグ取るのも大変なんだろうし 俺が普通じゃないコード書いてるからなんだけど バグ多すぎてワロタwwww 今日だけで2個踏んだったwwww なんでだろ、世界でずいぶん使ってる奴いるはずなのに、 俺はもういままでrubyのバグには自分で出したのだけで少なくとも10個以上 どうなってるのこの言語 とりあえずlambda周りとハッシュ周りに何かがある・・・
222 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 01:02:21.44 ] それがパーサのバグなら諦めろ Rubyのパーサはどうもならん
223 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 01:11:31.94 ] rubi使いはフリガナふってろ。初心者って自分のバグを人のせいにするよな。
224 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 01:19:03.05 ] >>218 201,209が「簡潔にならない」「具体例がないと分からない」というから挙げた例に 横からしゃしゃり出てきて一例だけピックアップして筋悪とか十分とか 結論ありきの難癖つけるってなんなのあんた?
225 名前:uy [2012/08/16(木) 01:20:06.45 ] > なんなのあんた? 俺俺。俺だよ。
226 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 01:29:22.60 ] コミュ障です。
227 名前:uy mailto:sage [2012/08/16(木) 01:30:59.89 ] >>223 ひとつは普通に[BUG]ってでた これはlambda周りのバグ もうひとつは、これはハッシュ周り [BUG]とはでないが、 存在しているはずの変数の中身が一定確率で(1度のイテレーションのみ?)だけ勝手にnilになってる nil => nil のハッシュなんか追加した覚えないのに両方nil とりあえずイテレータでまわしてる時に中でこれをやってはいけないっぽい task = Hash.new task.marge(...) task.each do task = 新しいハッシュ end これをどうにかなくしたらバグらなくなった いずれも小さなコードで再現させようとしてもバグってくれない 俺がわけわからんコード書いてるせいもあると思う もういやだ
228 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 01:35:09.09 ] >>227 中級者はバグを回避するコード書くのがあたりまえっえこと。
229 名前:uy [2012/08/16(木) 01:35:37.63 ] >>227 [BUG]というのは テメーのバグっていう意味だよw
230 名前:uy mailto:sage [2012/08/16(木) 01:36:32.34 ] >>227 あ,ごめんハッシュのほうは両方nilではないわ でも何か動作おかしいのは事実
231 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 01:42:31.92 ] そりゃお前、コンテナをイテレートしている最中にコンテナいじったら、 危ないだろうJK。Rubyに限らずどの言語でもご法度。
232 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 01:43:59.81 ] >>224 この一例が重要だから214が例示して、218が反論したんだよ もしブロックが単独のリテラルだったなら 1. Procを簡潔に記述できる 2. ブロック構文に関わる一連の糖衣構文(yield、&block、)が 通常のメソッド引数括弧の省略という形で統一的に記述できる 3. またこの枠組みでは複数の関数引数の記述も自然にできる それに対する反論が 1. 関数型スタイルを使いたいならProcではなくてlambdaでいいじゃん(糖衣構文がある) 2. メソッド引数括弧の省略に頼った記法は良くないとされている 逆に省略しないと記述が煩雑になる。つまり専用構文を用意するのがベター 3. 複数の関数引数は出現頻度が低いことが分かっているから重要でない むしろ一引数に特化している事が重要 →再反論:関数合成のような例は? っていう議論なんだから
233 名前:uy mailto:sage [2012/08/16(木) 02:12:27.19 ] もういいじゃんruby最強なんだから バグがあっても使う価値があるくらいには最強
234 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 08:15:45.11 ] 日本人の韓国旅行終了! 三井住友、韓国旅行者向けの新カード発行延期 engawa.2ch.net/test/read.cgi/poverty/1345036192/ 韓国旅行者向けの新カード発行延期 三井住友カード 三井住友カードは15日、韓国に旅行する日本人向けに予定していた新たなカードの発行を延期すると発表した。 提携する韓国のカード会社と22日にソウル市内で記者発表会を計画していたが、これも延期する。 韓国の李明博(イ・ミョンバク)大統領の竹島上陸や対日批判などを考慮し、「今サービスを始めるのはふさわしくない」(広報室) と判断したという。 このカードは、旅行前に日本円で入金しておけば、韓国のお店で韓国ウォンでの支払いができるプリペイド式で、9月上旬から 発行する予定だった。記者発表会は、日本でも人気の高い韓国人俳優らが出席する計画だった。 www.asahi.com/business/update/0815/TKY201208150428.html
235 名前:153 mailto:sage [2012/08/16(木) 10:04:35.58 ] >>211 ん、最終行にはリスト内包表記が見えるけど、気のせいかな? それはさておき、Pythonでは「ごく普通に」関数を定義して適用するのに対して、 Ruby(および関数型言語)では「ごく普通に」ブロックや無名関数を使って シンブルな式として表現できる、ということになった また当たり前だけど、>>211 のような関数を定義するコードはRubyでも書ける これは>>197 ,198で述べたように、関数型言語風プログラミングにおいて 局所宣言が無いというPythonの欠点、そしてRubyの優位性を示している
236 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 11:03:14.55 ] 無名関数のあるJSの勝利ですね。
237 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 11:05:52.40 ] >>235 Rubyは関数内関数を素直に定義できないじゃん Proc と lambda の違いとかキモイし どさくさにまぎれて関数型言語と一緒にすんなよ
238 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 11:45:22.78 ] phpでの話なんですが教えて下さい あるアドレスに下記の様にHTTPヘッダー関数で移動すると返ってくる内容がブラウザに表示されるのですが header("Location: {$add}") ; file関数、fgets関数等で下記の様に読み込むと中身がカラッポで入っていません $data = '' ; if ($fp = @fopen($add, "r")) { while (!feof($fp)) $data .= @mb_convert_encoding(fgets($fp, 1024), "EUC-JP", "auto"); fclose($fp); } $data = htmlspecialchars($data); file関数、fgets関数等で読み込んで中身を得るにはどうしたら良いでしょうのでか 教えて頂ける様お願いします
239 名前:238 mailto:sage [2012/08/16(木) 12:26:57.50 ] エラー抑制を外してみました if ($fp = @fopen($add, "r")) { ↓ if ($fp = fopen($add, "r")) { そしたら次の様なワーニングが出てきました 『 Warning: fopen(アドレス) [function.fopen]: failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden in 動いてるスクリプト on line 374 』 どうもアクセス相手側から拒否されている様です しかしヘッダー関数では取得できる様なのでどうにかしてfile関数等でデータを取り込みたいのですが どうしたら良いかご存知のかたいらっしゃったら教えて頂ける様お願いします
240 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 12:30:36.27 ] >>239 WebProg kohada.2ch.net/php/
241 名前:238 mailto:sage [2012/08/16(木) 12:32:19.66 ] >>240 thx
242 名前:uy [2012/08/16(木) 14:10:29.16 ] rubyは[]でかけるLISPとしても使えるんじゃなかった? メソッド揃えば完全変換できるかもよ procのlambda違いは有りなんだよ rubyは同じに見えて微妙に違う動作をするメソッドが数多く存在する それだけ細かい調整が標準ライブラリで効くってこと
243 名前:153 mailto:sage [2012/08/16(木) 14:13:16.73 ] >>237 >Rubyは関数内関数を素直に定義できないじゃん エッ!、Rubyは普通に関数内関数を定義できるよ??? 以前(1.8)は関数内関数のスコープに問題があったけど、今(1.9)では解消されたし ・メソッド定義のネスト - Ruby 1.9.3 リファレンスマニュアル doc.ruby-lang.org/ja/1.9.3/doc/spec=2fdef.html#nest_method というか、OOPLであるRubyでは、プライベートメソッドとして定義するのが一般的で、 関数内関数はまず目にすることはない しかも(>>211 のPyhtonのような)他LLでは関数定義を「普通」に使うけど、 Rubyならブロックがあるから一度しか適用しない関数は式の中に埋め込むのが「普通」 つまり、(関数内関数を多用せざるをえない他LLと違って)関数内関数を使う頻度は少ない >Proc と lambda の違いとかキモイし 確かにProcとlambdaの微妙な差異は分かりづらいよね でもRubyにはブロック構文があるから、(Procやlambdaのような)明示的な無名関数宣言を 使う頻度は比較的少ないし、使うケースでもどちらか一方を使えば済むことが多い また、言語の微妙な弱点を避けて、良い点を引き出すことに注力することが (Rubyに限らず)中級プログラマのたしなみの一つだと考える >どさくさにまぎれて関数型言語と一緒にすんなよ え、一度も「Rubyは関数型言語である」とは言ってないけど.....??? 「関数型言語風プログラミングには(他LLよりも)Rubyは明らかに優れている」と主張している
244 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 14:25:57.61 ] >>243 > エッ!、Rubyは普通に関数内関数を定義できるよ??? はあ?じゃあ何で関数内関数が外から見えてんだよ ideone.com/4J057
245 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 14:42:18.11 ] > つまり、(関数内関数を多用せざるをえない他LLと違って)関数内関数を使う頻度は少ない 関数型言語でも関数内関数を多用するけど...? 「関数型言語風プログラミング」って何? それってただの「Ruby風プログラミング」なんじゃないの?
246 名前:uy mailto:sage [2012/08/16(木) 14:43:56.36 ] rubyの仕組みがなんにもわかってないんだな それは結局selfが省略されているに過ぎない rubyはすべてがオブジェクトであり、インスタンスは特異メソッドをもつ事が出来る self.define_singleton_method :uy do p :uy end お前らの大好きなシングルトン でもこの設計はゴミカスだな 俺様個人の意見を言わせてもらうならdef内のdefは使わないほうがいいよ 普通にlambdaで ->{ } 書いたほうが短いんだからそっち使えばいいじゃん
247 名前:uy mailto:sage [2012/08/16(木) 14:48:03.05 ] >>246 すいません、思いっきり間違っていました忘れてください 旅にでます
248 名前:153 mailto:sage [2012/08/16(木) 14:50:55.63 ] >>244 わざわざideon上のコードを引用しなくても、Rubyの振る舞いは>>243 で示した リファレンスマニュアル「普通のメソッド定義式と同じ」の通りだよ??? 確かに、理想的には内側のメソッドが外部から隠蔽されたほうが望ましいことは認める これが>>211 のPythonコードのように、関数定義を多用するのが「普通」、 あるいは関数定義を多用「しなければならない」言語であれば、致命的な欠陥になる でも>>243 で述べたように、Rubyでは関数内関数の必要性がほとんど存在していないんだ もしも可能であるならば、ブロックやプライベートメソッド定義では読みづらかったり 冗長だったりするけど、関数内関数であれば素直に表現できるコード例を示してほしいなあ...
249 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 14:57:03.42 ] rubyはそこら中が関数といえば関数だからね do 〜 endって、でてきたらそれ全部関数だよ
250 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 15:03:34.35 ] だから関数型言語では関数内関数を多用するって言ってるのに... 関数型言語と違うスタイルなんだから「関数型言語風プログラミング」とか言うなよ
251 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 15:07:46.32 ] > 確かに、理想的には内側のメソッドが外部から隠蔽されたほうが望ましいことは認める 理想的にはじゃなく、ここが一番大事なところ
252 名前:uy [2012/08/16(木) 15:08:18.16 ] proc Proc.new lambda ->{ } def define_method define_singleton_method Module.new / Class.new / Struct.new こんくらいかな?メソッド内で関数のようなものを定義する方法 動作違うものが、これだけあるんだから動作調べて好きなの使えよ? defしか使えないバカなの?
253 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 15:23:14.80 ] >>248 > もしも可能であるならば、ブロックやプライベートメソッド定義では読みづらかったり > 冗長だったりするけど、関数内関数であれば素直に表現できるコード例を示してほしいなあ... なんだ、読みづらさや冗長さの観点で批判してたのか?関数型うんぬんは関係なく? じゃあ>>198 に比べて>>211 は読みづらくて冗長だからダメって言いたいんだな? そういうことは最初から言えよ
254 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 15:35:35.20 ] はよ旅立て。
255 名前:153 mailto:sage [2012/08/16(木) 15:41:10.73 ] >>245 >関数型言語でも関数内関数を多用するけど...? うん、関数型言語では関数内関数でプログラムを構築していくのが普通だね でもRubyはオブジェクト指向言語であり(>>243 の最後で書いたように)関数型言語ではないから、 モジュールやクラスでプログラムを構築するのが普通なんだ >「関数型言語風プログラミング」って何? 「(破壊的代入を含む)副作用を避けた参照透明性のあるプログラミング」(>>181 も参照) これは関数型言語のパラダイムと同じ もちろん(関数内関数ではない)Rubyでは、入出力や効率(性能や資源)といった理由から 完全に参照透明性のあるコードは書けないけど、それでも副作用を極力避けたり、 参照透明性のある部分とない部分を意識的に使い分ける、あるいは副作用のあるコードを隠蔽する 現実に実用的なテキスト処理プログム開発で試したところ(全体で約20Kstep)、 8割は参照透明性のあるコードで実装することが可能だった 残る2割の部分は、トップレベルの(入出力を含む)メイン処理モジュール群と 最下層の副作用をカプセル化(隠蔽)した内部ライブラリ群になる
256 名前:avacript [2012/08/16(木) 16:27:56.11 ] 関数型扱えない言語は終わってるよな rubyとか
257 名前:uy [2012/08/16(木) 16:51:25.73 ] rubyは関数型プログラミングも出来て便利だよな
258 名前:デフォルトの名無しさん [2012/08/16(木) 16:55:24.10 ] でもOSやミドルウエア、あるいはビジネスアプリにいたるまで 日本製ソフトのシェアはゼロに等しいよね。
259 名前:153 mailto:sage [2012/08/16(木) 16:57:54.51 ] >>250 >関数型言語と違うスタイルなんだから「関数型言語風プログラミング」とか言うなよ うん、ググってみたら確かに「関数型言語風プログラミング」は風変わりだった では、一般的な「関数型プログラミング(functional programing)」と改めよう
260 名前:153 mailto:sage [2012/08/16(木) 17:09:48.97 ] >>251 >理想的にはじゃなく、ここが一番大事なところ そう、クロージャやまともなラムダ式の無いPythonのような手続き言語における 関数型プログラミングでは、関数内関数こそが一番大事だよね Rubyはというと、(>>248 で書いたように)OOPLでブロックがあるからそれほど大事じゃないけど....
261 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 17:15:09.50 ] ラムダの文法を def 1; end にして、 メソッド定義は @method = def 1; end こんな感じの文法でよかったんだよ。 func = def 1; end こう書けばfuncはローカル変数だから外から見えないし。 同じようなものが一杯ありすぎる。 C++みたいに厳しいパフォーマンスが求められるってわけでも無いのにさ。 こんな行き当たりばったりな言語を良しとしている人は、 さぞプログラムも行き当たりばったり何だろうな。 かといって、ラムダの弱いPythonは土俵にすら立ててないのだが。 普及しててまともなLLって無いのかね。 もしJSにブロックスコープがあったなら、かなり良い言語になりえたんだがな。
262 名前:uy [2012/08/16(木) 17:42:47.29 ] >>261 おいバカ これ lambda ↓ ->{ } これlambda
263 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 17:43:38.98 ] ラムダしか知らないのかよお前はw
264 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 17:48:13.46 ] 旧世代的なラムダ脳にはリスト内包表記、イテレータ、ジェネレータ、デコレータを上手く使うPythonicなコードは理解出来ない なんとかラムダで書こうとするのは、どの言語でもCみたいなコードを書く奴と何も変わらん
265 名前:153 mailto:sage [2012/08/16(木) 17:59:30.07 ] >>261 >ラムダの文法を def 1; end にして、 ....(以下、省略) 構文の簡潔さという意味では、>>83 で紹介したSML(Standard ML)が理想に近いのではないかと 【ラムダ式】 fn hoge x y = <expr> 【条件分岐式】 if <expr1> then <expr2> else <expr3> 【多分岐式】 case <expr> of <pat1> => <expr1> | <pat2> => <expr2> | .... 【代入(束縛)】 val x = <expr> 【関数定義】 fun fuga x y = <expr> 【局所宣言式】 let val x = <expr> fun fuga x y = <expr> in <expr> 【モジュール定義】structure bar = struct <declarations> end 構文要素が必ず予約語で始まっていることがポイントになる また ;(セミコロン)は演算子であり、式「a ; b」は(aを捨てて) b の評価値を返すという意味になる 結果として言語仕様はコンパクトにまとまっているので習得が容易であり、 しかも言語全体の公式な形式的定義が存在するという特異な存在となっている ・Amazon.co.jp: The Definition of Standard ML: 洋書 www.amazon.co.jp/The-Definition-Standard-Robin-Milner/dp/0262631814/ >もしJSにブロックスコープがあったなら、かなり良い言語になりえたんだがな。 これは同感だね さらに条件分岐(if や switch)が文(statement)ではなく式(expression)であることも大切だと思う
266 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 18:07:02.49 ] そう思ってしまうのはクロージャがないC脳だから。 内から外へのスコープを区切るものは関数しかない、という単純さが損なわれる。 クロージャがあるからそれだけでも既にややこしくなってるのに。
267 名前:153 mailto:sage [2012/08/16(木) 18:11:28.09 ] >>264 論よりコード
268 名前:デフォルトの名無しさん [2012/08/16(木) 18:35:16.39 ] つまり、日本国はこの町並みを維持できる限り安泰ということだから、 大声張り上げて街中をデモ行進する人は宇宙空間にでも行って欲しい。
269 名前:153 mailto:sage [2012/08/16(木) 18:39:03.55 ] >>265 のカキコの中で、最後の「>もしJSにブロックスコープがあったなら、」以降を取り消す ブロックスコープをスコープと早合点していた
270 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 18:42:06.27 ] >>267 Closures in Python (part 1) ivan.truemesh.com/archives/000392.html >(ie. use a "list comprehension" - I think it reads a bit easier than using the map/lambda).
271 名前:153 mailto:sage [2012/08/16(木) 18:53:18.70 ] >>270 リンク先を眺めたけど、これらの例というのは(説明も何も無いから) RubyでもPyhtonでも同レベルで簡潔に書けるコードに見える これらの例について、いかにPythonが優れているかを「>>270 自身の言葉で」語って欲しい あるいは>>197 ,198のように、明らかにPythonが優位性であることが分かる例を希望する これじゃバトルにならんのだよ....
272 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 18:54:43.69 ] >>271 別にRubyが劣ってるなんて言ってないよ 馬鹿が譫言のようにクロージャクロージャと連呼してたから ああ、こいつはPythonのことをあまり知らないんだなあ、と思っただけ
273 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 18:55:24.50 ] Pythonが優位であることが分かる例か。シェアだな。
274 名前:153 mailto:sage [2012/08/16(木) 18:56:07.05 ] >>269 (>>265 )を再訂正 ....orz X: スコープと早合点していた O: ブロックと早合点していた
275 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 18:56:16.68 ] なお>>197 ,198でPythonが明らに劣勢であることを示せてると思ってる所にも同情する
276 名前:153 mailto:sage [2012/08/16(木) 19:00:35.26 ] >>272 では、そのPythonのクロージャとやらを使って、>>211 を書き直して欲しい Pythonにはクロージャがあるから、関数定義無しに書けるよね?
277 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 19:01:46.12 ] >>273 それに伴うライブラリの充実とかコミュニティの活発さはあるね
278 名前:デフォルトの名無しさん mailto:sage [2012/08/16(木) 19:02:19.29 ] そもそも関数定義無しに書けなきゃダメって 勝手にルール作ってるところがおかしい