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にシングルトンパターンは存在しないようだ。」 面接官「帰れよ。」
99 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 07:55:53.88 ] >>98 Prologにスコープはないな。
100 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 08:14:25.83 ] >>99 繰り返しは?
101 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 08:53:56.63 ] Prologにはブロックが無いよな Cでも if (foo && bar && ……) return 1; のように書ければ{}はほぼ無くなるし
102 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 08:54:26.78 ] スコープについてはRubyもPythonもPHP大きな差はないかな。 ブロックスコープなのはPerlだけでしょ。 それでもJSの場合、名前空間もなければClassもないので、一番分かりづらいというのはあるね。
103 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 09:04:12.85 ] >>98 どうおかしいの?
104 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 09:16:09.79 ] >>100 繰り返し構文がないのだから、「ない」と言い切っていいんじゃないか。 仕様が「繰り返せ」の場合は再帰で表現するのだが、これも、繰り返しとも 読める、くらいの解釈でいい。節と節がバラバラに主張していて先ずその主張の 核心を「宣言的に」読み取るのがPrologなのではないか。仕様の繰り返しを陽に するには、述語名で「・・・を繰り返す」とはっきり述べるのが一番よいだろう。
105 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 09:33:09.22 ] >>103 RubyもPythonも大きな差はないとか言われてもスルーしてる時点でおかしいだろ
106 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 09:44:51.21 ] さらっと流されてるが、>>86 とか>>91 のJSに関する説明はちょっとおかしいよね? {i=0; {var i=1;} } とかしてもJSにはブロックスコープは無いから外側のiと内側のiは同じものになってしまう var宣言を単純にブロックの内側と外側の変数を区別するものには使えない JSでブロックスコープ的なものが使いたいときはブロックの代わりに無名関数でくくらないと {i=0; (function(){ var i=1; })(); }
107 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 10:20:58.13 ] あーそれは擬似コードだから。 PythonとRubyとJSでそれぞれ記述が違うので、 {{}}で、ネストスコープ一般を表現したってだけ。
108 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 10:28:50.69 ] JSのスコープのネストは関数スコープで作る前提の話なのか たしかにブロックのスコープとは書いてないね
109 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 10:59:07.14 ] うんこな言語集めてどっちがマシとかマジうけるわ マトモな言語使いたかったら静的型付け関数型言語でも使ってろ
110 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 11:15:01.64 ] >>109 スレタイ嫁
111 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 11:20:59.96 ] Javascriptを読み書きしてると function() がゲシュタルト崩壊する
112 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 12:17:19.67 ] Perlよりマシといえば大抵のことが許される雰囲気があった 実際にはPerlに勝ったとか負けたとか考えない言語のほうがマシだった
113 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 16:44:44.54 ] javascriptとsmalltalkのうんこさはそっくり
114 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 22:46:09.32 ] # C 1 for() 2 { 3 コード 4 } # ruby 1 map do 2 コード 3 end do 〜 endより { } のほうが、読みやすいことが分かった
115 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 22:52:33.16 ] >>113 smalltalk風の開発環境でDOMやhtml5を弄れるruby処理系なんてあれば最強じゃね?
116 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 22:58:15.05 ] Smalltalk処理系を流用した Ruby処理系(MagLev)ならあったが……
117 名前:デフォルトの名無しさん mailto:sage [2012/08/14(火) 23:31:05.55 ] >>114 ハア? irb(main):001:0> [1,2,3].each { |x| p x } 1 2 3 => [1, 2, 3]
118 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 00:44:10.32 ] codejamってjavascriptだけハブられてるのね PHPからclojureまであるのに
119 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 07:29:06.13 ] JSの良さは、熱心なファンがいないってところでもあるからな。 勝手に広まって勝手に定着したから。
120 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 08:37:53.53 ] Javascriptのファンなんて希少種だろ 他言語からJavascriptへコンパイルするのが流行り 直接Javascript書くのは低能
121 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 09:00:24.91 ] >>120 定着しないのが特徴かな。実行環境が不安定過ぎた。 一時熱中して、そして去っていく。だから、プログラマ数も増えない。
122 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 09:31:59.66 ] >>120 今後は、これまでの軽量言語を抑えて最大になると思うけど githubは既にjsの登録数がrubyを越えている そして、熱心なファンは海外ではninjaだとか言われてるみたいだぞ
123 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 09:42:35.15 ] >>121 TIOBE INDEX がそれを物語っているね。みんなJSはもっと 使われてるでしょって言う。使ってみた人の数は多いが、 現時点での活性はやはり検索数のようなものに出てしまう。
124 名前:デフォルトの名無しさん [2012/08/15(水) 11:16:18.20 ] jsがどこで流行ってるのかわからない あれがブラウザ以外で使えると思ってる子はちょっとな ブラウザ用に作られてる言語だからそれを外に引っ張り出してきても コーディング自体が楽になるようなシンタックスシュガー系の拡張は何もやってくれないと思うよ そんな言語で頑張りたければどうぞ
125 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 11:26:01.35 ] >>124 Ajaxは流行ったと思うけど、それでもダメだった。きびしいですね。
126 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 11:29:37.61 ] ここはどんだけガラパゴスですか
127 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 11:33:37.84 ] どうであれ、ブラウザでは生き残るから、 流行り廃りに関係ない、息の長い言語になるだろうね。
128 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 11:39:35.25 ] >>126 www.tiobe.com/index.php/paperinfo/tpci/JavaScript.html
129 名前:デフォルトの名無しさん [2012/08/15(水) 12:01:49.91 ] まあブラウザに多言語乗っける流れがくるよ その時がjsの終わり
130 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 12:17:02.89 ] Googleが乗せようっていうとMSは嫌だって言うだろうし、 MSが乗せようっていうとAppleが嫌だって言うだろうし、 なかなか標準の規格に入らないんじゃないかね。 別に規格外でも、互換性糞食らえで乗せたきゃ勝手に 乗せればよいんだが、特定のブラウザでしか動かないのでは 普及するわけ無いし。 やっぱり足並み揃えない取って事で、 新バージョンのJSが乗っかって終わりでしょう。
131 名前:デフォルトの名無しさん [2012/08/15(水) 12:26:28.68 ] >>129 今以上にカオスになるな クロスブラウザ対応不可能になる
132 名前:uy [2012/08/15(水) 13:14:53.16 ] これから苦労してjsをマシな言語にさせていくよりは他言語入れたほうが早い
133 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 13:16:51.90 ] たとえそうでも、他の言語をねじ込むのは無理。 Appleが提案してもGoogleとMSは反対する。
134 名前:uy [2012/08/15(水) 13:30:47.00 ] ruby2.0はChromeで動く可能性が高い
135 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 13:40:46.02 ] はぁ、NaCLね。はいはい
136 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 14:10:15.96 ] またuyがRuby関係のスレをage荒らしてるな。 議論に負けるといつもこれだ。
137 名前:uy mailto:sage [2012/08/15(水) 14:18:24.05 ] IronRubyは存在する IronJavaScriptは存在しない
138 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 14:23:07.71 ] .NetならC#だろ。バカじゃね。 同様にブラウザで動かすならJSだがな。 RubyはPythonともろに食い合う不幸な運命。
139 名前:uy mailto:sage [2012/08/15(水) 14:25:59.58 ] えっ ynupl.com/reddam/archives/155 こういう使い方だと思うけど なんだと思った? Scala(笑)がJavaのクラスを継承できます(キリッ)とかいってたけど それと同じ
140 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 14:33:23.30 ] まずさ、Rubyを普及させたいのなら、何かツールを作ったら? C言語はOSを作るために作った言語だし、 JSはネスケ社がブラウザ作る片手間に作った言語だし、 JavaはJavaVMと一蓮托生だし、 C#は.Netのために作った言語。 だからさ、Rubyも普及させたいのなら、marzに頼んで、 社会の基盤になってしまうような、革新的超便利ツール作ってもらって、 その組み込みスクリプト言語としてRuby乗せれば? 言語だけ作って後はポイ投げってのはダメ言語の典型なんだよ。 むしろツールの作成を本業とし、そっちの普及を目的とすべし。 言語開発なんかは、必要に迫られて、傍らでするぐらいでよい。 普及してて人気のある言語はほとんどそう。 ツールに引っ付いて勝手に広まった。
141 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 14:36:53.30 ] Rにくっついて広まるかも。 shop.oreilly.com/product/0636920022626.do
142 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 14:40:36.21 ] >>137 えっ ja.wikipedia.org/wiki/JScript#JScript_.NET
143 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 14:43:17.24 ] >>140 元がPerlに不満を持ったMatzが書き上げたオレ言語がRubyなので 実際今でも一番多い使い方が たぶんシェルスクリプト・Perl・make辺りの代替でしょ プロダクト未満の小物が本来の主戦場 ただ、何か知らんが一部のハッカーの琴線に触れるものがあるらしく RailsやらRedmineやらMetasploitやら 一線級のソフトも出てきた、というのがここ5年ぐらいの話
144 名前:デフォルトの名無しさん [2012/08/15(水) 15:07:36.87 ] (*´・∀・)(・∀・`*)ヘー
145 名前:uy mailto:sage [2012/08/15(水) 15:10:21.84 ] Rubyはまだまだ歴史が浅い
146 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 15:17:03.87 ] Rubyはなんでdoに|つけるの?
147 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 15:19:13.66 ] たしかJavaと同時期のリリースだったよね。
148 名前:uy mailto:sage [2012/08/15(水) 15:23:41.39 ] どうしてこんなに差がついたのか。
149 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 15:39:44.61 ] >>146 パイプでブロック引数をはさまないと、 それがブロック引数なのか、 単に式としてそこにあるのかが区別できない
150 名前:uy [2012/08/15(水) 15:42:23.84 ] クソ仕様ですみませんwww
151 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 15:46:24.88 ] >>149 pythonみたいな for t in list: みたいにできなかったの? 絶対にこっちのほうがわかりやすいと思うんだけど||でかこったら特殊な演算やってそうじゃん
152 名前:uy mailto:sage [2012/08/15(水) 15:48:47.94 ] >ただ、何か知らんが一部のハッカーの琴線に触れるものがあるらしく ていうか、何で分からないのか分からない 最初から最後までオブジェクトで出来てる時点でさ if true 5 end.times do | n | p n end こう、IFの戻り値さえそのままメソッドチェインで使えるんだけど
153 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 15:49:51.63 ] >>151 for t in list; end という構文も最初から存在していますけど、なにか?
154 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 15:54:31.43 ] >>152 Rubyにおいて if や case といった条件分岐は 文(statement)ではなく式(expression)だから これはSmalltalkも同じ 手続き型言語として見れば異端だけど、 関数型言語として考えれば実に自然なプログラミングができる
155 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 16:03:00.24 ] >>153 なんであんまりrubyではその構文使わずに使わずにeach doするの?
156 名前:uy mailto:sage [2012/08/15(水) 16:22:03.27 ] for文()よりもeachの方がメソッドチェインできて最強だからだよ
157 名前:uy [2012/08/15(水) 16:23:28.48 ] メソッドチェインってなにがいいの?
158 名前:153 mailto:sage [2012/08/15(水) 16:26:13.52 ] >>155 おそらく列挙オブジェクトへブロック付きメッセージを送るという Smalltalk流のオブジェクト指向スタイルが好まれるからだと思う for構文は手続き型スタイルであり、PerlやPythonから移ってきたばかりの Ruby初心者は、最初for構文を使うけど、Rubyを深く知るにに従って (forよりも柔軟な)オブジェクト指向スタイル、つまりRubyらしい プログラミングスタイルを身につけていく
159 名前:uy mailto:sage [2012/08/15(水) 16:39:40.59 ] メソッドチェインの有用性から説明しないとダメな奴がいるの?
160 名前:153 mailto:sage [2012/08/15(水) 16:42:30.15 ] >>157 メソッドチェインに関しては過去スレで話題になったけど、 最大の利点は左から右へと流れる、自然に読み取れるコードが 書けることだと思う
161 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 16:42:44.79 ] 柔軟な例とかない?
162 名前:uy mailto:sage [2012/08/15(水) 16:52:58.51 ] rubyで一番よく使うのはmap、これは戻り値に配列を返す 普通に書いたら p [1,2,3].map { |x| x*2 } # => [2, 4, 6] だけど、メソッド(イテレータ)チェインする事によって、本来配列を返さない each_with_indexなども p [1,2,3].each_with_index { |x,i| x*(2+i) } # => [1, 2, 3] mapを置く事による戻り値を変えられる p [1,2,3].each_with_index.map { |x,i| x*(2+i) } # => [2, 6, 12] これをforで書くとこう s = [] i = 0 for x in [1,2,3] s << x*(2+i) i += 1 end p s for文とイテレータじゃ力の差が有りすぎて異論の余地すらない
163 名前:153 mailto:sage [2012/08/15(水) 17:05:47.91 ] >>161 たとえば「あるリストを選別してソートして計算して書き出す」という お題の場合、以下のような破壊的代入の無い流れるようなコードが書ける list.select { .... }.sort { .... }.map { .... }.each do; .... end もしRubyにfor構文しか存在しなければ、一時変数をゴリゴリと更新していく ループ処理を並べた典型的な手続き型コードになる
164 名前:uy [2012/08/15(水) 17:19:49.47 ] つまり、書き方がちょっと変わっただけである。
165 名前:uy [2012/08/15(水) 17:21:52.02 ] 実際は list.select { hoge hoge hoge hoge hoge hoge }.sort { hoge hoge hoge hoge hoge hoge }.map { hoge hoge hoge hoge hoge hoge }.each do; hoge hoge hoge hoge end となって見難いのである。 だから縦に流れるようなコードにしたほうがいい。 list.select { hoge hoge hoge hoge hoge hoge } list.sort { hoge hoge hoge hoge hoge hoge } list.map { hoge hoge hoge hoge hoge hoge } list.each do; hoge hoge hoge hoge end
166 名前:153 mailto:sage [2012/08/15(水) 17:28:12.26 ] >>165 文が1行で収まらなければ、改行とインデントを使って 上から下へ流れるコードを書けばいい 工夫すれば、実用的なプログラムでもすべて80桁以内になるよ list.select { hoge hoge hoge }.sort { hoge hoge hoge }.map { hoge hoge hoge }.each do hoge hoge hoge end
167 名前:デフォルトの名無しさん [2012/08/15(水) 17:28:58.74 ] >>> [val*(2+idx) for idx,val in enumerate(sorted([3,2,1]))] [2, 6, 12] メソッド入れ子でもいいんちゃう?
168 名前:153 mailto:sage [2012/08/15(水) 17:44:23.49 ] >>167 はPyhon自慢のリスト内包表記だけど、 同じ計算は、Rubyであれば(>>162 を少しだけいじって) 左から右へと流れるコードになる irb(main):001:0> [3,2,1].sort.each_with_index.map { |x, i| x * (2 + i) } => [2, 6, 12] さて、どちらが読みやすいと感じるかな?
169 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 17:53:53.31 ] 読みやすさで言えば、一時変数を用意するやり方だろう。
170 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 17:58:45.01 ] それはペチパー君が慣れてないだけです
171 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 18:05:30.28 ] 慣れ言い出したら、それで全て解決だな。
172 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 18:07:20.33 ] 自転車こぐのも慣れが必要だよ
173 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 18:08:42.47 ] >>168 どうみてもPythonのほうが読みやすい
174 名前:デフォルトの名無しさん [2012/08/15(水) 18:15:01.60 ] .map{|x| x*2}. みたいに続いていく構文が若干分かりにくいんだよね {}で囲まれてると関数に見えるし ||も引数なのかなんなのか謎だし まあ慣れなんだろうけど
175 名前:153 mailto:sage [2012/08/15(水) 18:21:38.11 ] >>173 >>168 のRubyコードを第三者へ説明しようとしたら リスト定数をソートしてから添字付きで列挙し、各要素の計算値で写像する と、左から右へと流れるコードの構成に沿って記述できる これはトイプログラムに限らず、>>166 のような長く大きなコードでも同じ さて、>>167 を第三者へ説明しようとすれば、どんな文章になるかな?
176 名前:153 mailto:sage [2012/08/15(水) 18:25:51.31 ] >>174 関数に見えるというか、無名関数という関数そのものだよ lambdaのような予約語が省略されているだけ
177 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 18:40:16.04 ] だから、分かりやすいのがよいなら、 一時変数用意すればよいだろ。何の説明も要らなくなるよ。
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だろうとローカル変数は宣言されるから