[表示 : 全て 最新50 1-99 101- 201- 301- 401- 2chのread.cgiへ]
Update time : 08/19 08:36 / Filesize : 129 KB / Number-of Response : 494
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【Perl,Python,PHP】LL バトルロワイヤル 25【JavaScript】



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にシングルトンパターンは存在しないようだ。」
面接官「帰れよ。」


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だろうとローカル変数は宣言されるから




200 名前:デフォルトの名無しさん mailto:sage [2012/08/15(水) 22:07:42.58 ]
>>197
HaskellもPythonも使えるから
どっちも楽勝で読める

あとHaskellならそのケースだと内包表記じゃなくて map fn xs だな
短いし読み易い






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<129KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef