12/08/11 12:21:25.19
面白かったのでコピペ
979 名前:uy[sage] 投稿日:2012/08/11(土) 11:53:55.80
面接官「特技はRubyとありますが?」
学生 「はい。Rubyでならなんでもかけます。」
面接官「ではシングルトンパターンを書いてください。」
学生 「存在しません?」
面接官「え、存在しない?」
学生 「はい。存在しません。Rubyはシングルトンパターンを言語でサポートしています。」
面接官「・・・で、その言語でサポートされた機能を使うとシングルトンパターンになるんですよね?」
学生 「はい。シングルトンパターンです。」
面接官「いや、あなたRubyでシングルトンパターンは存在しないといいましたよね。なぜシングルトンパターンになるんですか?」
学生 「でも、シングルトンパターンは存在しないんですよ。」
面接官「いや、存在しないとか問題じゃなくてですね・・・」
学生 「Rubyなら簡単にシングルトンパターン書けますよ。」
面接官「ふざけないでください。それに機能が用意されてるってことは存在するでしょ。だいたい・・・」
学生 「機能は用意されていますが言語でサポートしているんです。だから存在しません。」
面接官「聞いてません。帰って下さい。」
学生 「あれあれ?怒らせていいんですか?シングルトンパターン書きますよ。」
面接官「いいですよ。書いてください。Rubyでシングルトンパターンを。それで満足したら帰って下さい。」
学生 「運がよかったな。Rubyにシングルトンパターンは存在しないようだ。」
面接官「帰れよ。」
2:デフォルトの名無しさん
12/08/11 12:26:04.75
面白くないし>>1にそんなもん貼る神経が分からん
キモすぎるわ
3:uy
12/08/11 12:28:09.50
>>1に貼っておけばスレがある限りずっと見れるだろう?
4:uy
12/08/11 12:32:37.65
993 名前:uy :2012/08/11(土) 12:11:44.29
ほらよ
デザインパターンのシングルトン
URLリンク(doc.ruby-lang.org)
rubyのシングルトン
URLリンク(doc.ruby-lang.org)
はい、"完全"別物です
997 名前:uy :2012/08/11(土) 12:13:37.44
>>995
だーかーら、rubyちょっとは勉強しろよ話にならねーから
ヒント:methods.sort.grep(/singleton/)
5:uy
12/08/11 12:37:30.73
はいはい雑魚ざっこ しねしね
6:uy
12/08/11 12:59:49.00
>>4
でさ、マジで聞きたいんだけど、
お前その2つが両方共
シングルトンだと思ってるの?
7:uy
12/08/11 13:01:39.22
なんで知識量で完全に劣ってるのに、そんなに勇猛果敢に挑戦してきて敗北して涙目になろうとするんだろう
わけがわからないよ
8:uy
12/08/11 13:02:12.10
>>7
自分のことぐらい自分で分かれw
9:uy
12/08/11 13:03:18.76
はやく謝れよ
10:uy
12/08/11 13:12:19.06
ねえまだ?
11:uy
12/08/11 13:20:55.28
def self.あ
end
これはシングルトンメソッドです
特異メソッドです
12:uy
12/08/11 13:34:36.00
シングルトンメソッドというのは
シングルトンパターンとどういう関連があるのでしょうか?
13:デフォルトの名無しさん
12/08/11 13:41:46.47
ゴミ
14:uy
12/08/11 13:48:27.68
シングルトンメソッドは、
シングルトンパターンという名前の
シングルトンを借りただけってことがわかりました。
つまり、目的がぜんぜん違う別物です。
Rubyはもちろんシングルトンパターンがありますが
それとは別にシングルトンメソッドがあるということです。
15:デフォルトの名無しさん
12/08/11 13:50:00.58
singletonはインスタンスが複数になりそうな時のが良く使うな。
16:uy
12/08/11 13:50:16.10
よくできましたおめでとうー(≧ヘ≦)
17:uy
12/08/11 13:52:11.02
書籍「デザインパターン」にも載っていたね。
名前とは反して、インスタンス数を最大いくつって
制限する方法が応用例として書いてあったよ。
18:uy
12/08/11 13:52:54.07
馬鹿がシングルトンメソッドの話をして
混乱させただけというわけかw
さあ、シングルトンパターンの話に戻りましょう。
つまり>>1です。
19:uy
12/08/11 13:54:27.80
馬鹿が混乱させたというか、
馬鹿が一人で混乱してただけだろw
20:uy
12/08/11 13:57:06.71
どうやらキチガイも消えたし、
デザインパターンは、考え方であって
実装コードじゃないの意味がやっと理解できたんだろうね。
無知なやつほど、よく噛み付く。
21:uy
12/08/11 14:07:20.82
observerみたいに実装コードを一部巻き込んでるものもあるよ
メソッド名がupdateと決まってる
22:uy
12/08/11 14:09:19.05
メソッド名が決まってるだけじゃ
実装コードとは言わんw
23:uy
12/08/11 14:10:24.11
Ruby厨って、インターフェースと
実装を分けて考えるってのが
苦手なのかもしれないね。
インターフェースって言語機能のやつじゃなくて
これも考え方の話。
24:デフォルトの名無しさん
12/08/11 14:49:58.70
無駄に書き込み分けるのってrubyの言語仕様なのかな。
25:uy
12/08/11 15:18:01.22
rubyではこのようにして現在ヒープにある様々なオブジェクト一覧を取得できます
p ObjectSpace.count_objects
test_uy = 9999999999
ObjectSpace.each_object.map do |m|
m
end
.each do |m|
if m.to_s =~ /test_uy/
p m
end
end
こんな事出来る言語ほかにある?
勝てそうな言語ある?
26:デフォルトの名無しさん
12/08/11 16:05:51.58
uyは定期的にRuby関係のスレをageまくる。
そんな事しても、Rubyはそのうちフェードアウトするのでご心配なく。
なぜなら文法が汚すぎるから。
27:uy
12/08/11 16:23:45.44
もともとrubyはperlの代用
一時的にperlがいけなかった場所まで上っているにすぎない
28:uy
12/08/11 17:02:00.80
rubyは日本語資料多いので
英語が苦手なプログラマーにもお勧めです
29:デフォルトの名無しさん
12/08/11 17:08:49.20
スクリプト言語のオブジェクト指向は連想リストと名前空間で十分だろうなと思っている
30:デフォルトの名無しさん
12/08/11 17:14:16.81
普段の作業はそんなもんだと思う
でもそれだけだとスクリプト言語でCのライブラリを書き写して公開するとかが簡単にはできない
31:デフォルトの名無しさん
12/08/11 17:16:51.40
matz,guido,larry,stroustrup,gosling,Hejlsberg,K&R
を一ヶ所に閉じ込めれば最強のecmaスクリプトが出来上がると思うの
32:デフォルトの名無しさん
12/08/11 17:17:59.94
>>25
こんなのRubyの専売特許じゃない
33:uy
12/08/11 18:47:14.71
>>25
Java
URLリンク(itpro.nikkeibp.co.jp)
> 「URLリンク(localhost:7000)」で閲覧できるのはクラスの一覧です。
34:uy
12/08/11 18:47:55.40
こっちのほうがわかりやすいかな。
URLリンク(www.javainthebox.net)
35:デフォルトの名無しさん
12/08/11 18:48:08.19
小学校の頃ヒステリーな奴がいたなぁ
36:デフォルトの名無しさん
12/08/11 19:09:09.51
とりあえずPythonのコード置いときますね
foo = 999999
[print(y) for x,y in locals().items() if x == 'foo']
37:デフォルトの名無しさん
12/08/11 19:51:17.88
それ出来ないのって、c/c++だけじゃないのか
38:デフォルトの名無しさん
12/08/11 20:16:15.88
C++の美徳は余計なことをしない、だからな。
そういうことをしたいなら、そういうコードを書いてくださいっていう。
共通の基底クラスすらないし。
39:デフォルトの名無しさん
12/08/11 21:31:11.39
c++で共通の基底クラスを自前で実装しているコードは眺めたことあるな
あれは一体、何が嬉しいんだろう
40:デフォルトの名無しさん
12/08/11 21:40:17.00
デバッグがしやすいとかじゃないかな。
41:デフォルトの名無しさん
12/08/11 21:52:26.98
デバッグ用途にutilクラスでも作るのかしら
c++にinstanceofみたいな命令あったかな
42:デフォルトの名無しさん
12/08/11 21:58:13.86
何がしたかったとかC++使いに問うてはいけないと思う
43:デフォルトの名無しさん
12/08/11 22:21:30.71
~使いって、はてなやtwitter民だよね
リア充臭いから爆発しないかな
44:デフォルトの名無しさん
12/08/12 01:32:08.05
cとmatlabが最強だよ
web系記者はアホな記事を書きやがって
45:デフォルトの名無しさん
12/08/12 01:53:47.56
>>31
おい一人鬼籍に入られてる
46:デフォルトの名無しさん
12/08/12 13:51:52.99
LLだの言ってスクリプト言語しか会話できんやつら&言語がキモすぎる。
RubyやPytonなんてLLなんて言わん。単なるスクリプト言語。
もう俺がLLの必須定義を2つ書いておくからお前ら条件満たしてない言語の会話するなよ。
LLの定義
・C/C++/javaの代替を目指す言語であること。
・コンパイラが存在すること、VMが充実していること。
この2つは絶対に必要十分条件だ。
低レベルなプログラミングを目指すのに実行環境が用意できん言語とか一発退場だ。
RubyとPythonはこの時点でアウト、スレチ、なんのために存在するの?
LLなんて入れるのはJavaScriptしかねえだろ。
VMはほぼどのパソコンにも乗っている。
コンパイラもインテルがHPC向けに作ってる。
サーバーサイドもJavaScriptも浸透してる。
今の世の中、JavaScript以外にLLの選択肢なんてない。
LLの定義を勘違いしてるウンコ君どもはサーバーサイドプログラムのバトルロワイヤルでもやってな。
47:デフォルトの名無しさん
12/08/12 13:54:27.71
うわぁキモいwww
お前日本語のLLの定義が嫌なら
書き込みも英語でしろよ
48:デフォルトの名無しさん
12/08/12 13:59:01.33
RubyやPythonは特殊すぎるからスレを分類すべき。
PHPも独立させるべきかな。
あとついでPerlはもう誰も触れないからいっか。
49:デフォルトの名無しさん
12/08/12 14:03:07.42
次スレはJavaScriptひとりロワイヤルになるのか
50:デフォルトの名無しさん
12/08/12 14:11:17.83
コンパイルしてJavascriptに変換出来る言語処理系リスト
この中からバトルロワイヤルします
URLリンク(github.com)
51:デフォルトの名無しさん
12/08/12 15:11:24.40
他の言語は全部劣ってんだからJavaScriptでいいやん…。
52:デフォルトの名無しさん
12/08/12 15:14:00.41
スクレイピングも出来ない言語はこまる
53:デフォルトの名無しさん
12/08/12 15:16:12.93
>>51
言語として本当にJavascriptが優れてたら
>>50のリストがこんなに一杯にならないと思うよ
直接Javascript書けば済む話だからね
54:デフォルトの名無しさん
12/08/12 15:21:19.17
>>51
試しにコマンドラインから使えるgrepとcurlのサブセットでも書いてみてくれないか(煽りじゃないよ)
どんなふうにJavaScriptでPerlやRubyを代替するのか知りたい
55:デフォルトの名無しさん
12/08/12 16:59:40.67
>>36
どちらかというと gc.get_objects() じゃない?
56:uy
12/08/12 18:22:47.60
Xtendが結構やばいよ
scala(笑)とは違うのが一目でわかった
rubyっぽくかけるJAVAって印象
あれが伸びたら動的言語の地位が危ない気がすると俺様は警告を出してみる
57:デフォルトの名無しさん
12/08/12 18:33:21.22
>>53
お前C言語ディスってんのか
58:デフォルトの名無しさん
12/08/12 19:09:09.61
jsはもう2段階くらい化けないと
59:デフォルトの名無しさん
12/08/12 20:08:27.37
Javaの方向に二段階くらい化けてドカタ専用言語化すると良い
60:デフォルトの名無しさん
12/08/12 20:19:12.50
それがいい。ドカタ専用言語ってことはそれだけ高い生産性と派遣でも理解できる容易さがあるってことだ。
C言語、Java、HTML&JavaScript、PHPやらが現状のドカタ専用言語。
社会で使われないRubyとPythonは生産性の欠片もないんだろうな。
61:デフォルトの名無しさん
12/08/12 20:27:50.58
ドカタは生産性の高い言語を選んでるワケじゃなくて
低能だから習得可能な言語が限られているだけだよ
ドカタ専用言語 ≠ 生産性が高い
62:デフォルトの名無しさん
12/08/12 21:00:52.62
で、君の言う生産性の高い言語を使うと、いったい何パーセント生産性があがるわけ?
たいして上がらなかったから未だにC言語がシェアNo1なんじゃないの?
63:デフォルトの名無しさん
12/08/12 21:01:21.06
100歩譲ってrubyがゴミだという事にしても
Pythonをバカにする奴はにわか
64:デフォルトの名無しさん
12/08/12 21:12:14.40
つっこみにくい自虐釣りだなあ
65:デフォルトの名無しさん
12/08/12 21:57:28.35
>>62
それ訊いてどうしたいの?どうせ低能の君には使えないのに
66:デフォルトの名無しさん
12/08/12 22:14:23.14
>>54
こんな簡単な問題にレスがつかないのって何で?
67:デフォルトの名無しさん
12/08/12 22:19:00.80
パイソニスタ ルビリストが今日は荒れてるな
68:デフォルトの名無しさん
12/08/12 22:22:48.79
>>65
結局そういう煽りしか出来ねーんじゃん。
69:デフォルトの名無しさん
12/08/12 22:31:11.68
このスレの存在意義って…
70:デフォルトの名無しさん
12/08/12 22:51:31.69
rubyによる他LL公開処刑場だよ
スレタイに入ってる言語はruby様に刃向かった為に論破されていく
71:デフォルトの名無しさん
12/08/12 23:10:27.51
>>69
隔離スレ
72:デフォルトの名無しさん
12/08/12 23:19:31.25
>>71
隔離スレとして機能してねーじゃん
73:デフォルトの名無しさん
12/08/12 23:21:20.74
>>69
キチガイをヲチしてニヤニヤするスレです
ほーらruby厨がすぐ近くに!
74:デフォルトの名無しさん
12/08/12 23:26:12.33
>>68
自分は>>54だけど>>66とは別人(どうでもいいけど)
探してみたらJavaScriptにも雑用向けのライブラリ入りの処理系がちょいちょいあるようだ
URLリンク(developer.mozilla.org)
そのうちJSDBって処理系だとこう書けるらしい。普通に使えそう
URLリンク(www.jsdb.org)
75:デフォルトの名無しさん
12/08/12 23:35:50.63
varってどうにかならんの
76:デフォルトの名無しさん
12/08/12 23:37:57.29
つ coffeescript
77:デフォルトの名無しさん
12/08/12 23:39:19.32
JavaScriptのvarは省略できるけどグローバル変数になるんだったか
78:デフォルトの名無しさん
12/08/13 10:33:57.60
JSはvarがあるから良いんだよ。
動的型言語だから、型を指定する必要は無いけど、
それでも変数のスコープを指定する必要はあるので、
結局変数宣言は省けない。
無理に省くとPythonやRubyみたいに奇妙なことになる。
79:デフォルトの名無しさん
12/08/13 10:36:32.02
JS益々低迷。
URLリンク(www.tiobe.com)
80:デフォルトの名無しさん
12/08/13 11:11:23.23
てかそれだとjsってイテレータ用の変数にまでvarつけなきゃじゃねーの
使われない理由のひとつがまずそこら辺だろう
81:デフォルトの名無しさん
12/08/13 11:13:52.71
グローバル変数のほうが使う機会って少ないんだから
何かオプションつけて宣言するならグローバル変数のほうだよ
jsは逆に設計しちゃったのか?
ローカル変数は簡単な記述でいいのに
82:デフォルトの名無しさん
12/08/13 11:56:10.67
>>81
一理あるが、それがその場しのぎの屁理屈ではないということを示すためには
「引数も多いから引数も宣言するべきではない」と言い切る覚悟が必要
83:デフォルトの名無しさん
12/08/13 11:57:16.00
ML系の言語、たとえばSML(Standard ML)だと、
代入(名前への値の束縛)にはJSと同様、文の頭に val が付く。
ただし、SMLの場合はあらゆる構文で文が予約語から始まることで
言語全体の構文が簡潔で明解になっている。
また階層的で明確な名前空間があるから、変数にグローバルや
ローカルといった区別は不要。トップレベルで代入された変数が、
いわるゆグローバル変数と同等な扱いになる。さらには大規模開発向けに
モジュールによって名前空間を明示的に分離できる。
考えるに、元々JSはWebブラウザ上の素朴な簡易スクリプト言語として
設計されたけど、近年では重要度が増して開発規模が増大してきた。
言語設計の想定外の用途に利用が広がったことの弊害ではないかと思う。
結論から言うと、言語設計時に大規模開発を想定していた
PythonやRubyといった他のLLと比較して、JSは大規模開発に向いていない。
84:デフォルトの名無しさん
12/08/13 12:03:30.82
そもそもブロックスコープがないjsでローカル変数っていうのもな
Cみたいに関数冒頭で宣言する言語なんだろ結局
関数ネストがよく使われる言語だし
jsで大規模やろうとするとオレオレのクラス実装や名前空間実装出てきちゃうのはあるな
その為のcoffeescriptとかなんだろうけど
85:デフォルトの名無しさん
12/08/13 12:05:04.84
>>82
全然わからんので日本語で頼む
86:デフォルトの名無しさん
12/08/13 12:06:26.04
>>81
グローバルとローカル以外にも、その中間にあたる、ネストスコープとかあるから。
特に最近はクロージャやラムダを多用する方向だから、ネストスコープだらけになる。
もし変数宣言がなければ、の { i=0; { i=1; } }
内側のiと外側のiが同じものなのか違うものなのか区別を付けれない。
ちなみに、Rubyだと同じもの、Pythonだと違うもの、となる。
Ruby方式だと、意図せずに変数名が被ったときにバグるし、
Python方式だと、外のスコープの変数への代入が出来ない。
その点、JSだと、varが付いていれば新しい変数、なければ外のスコープの変数、
だから、使い分けが出来るし、かつ安全で、可読性も高い。
87:デフォルトの名無しさん
12/08/13 12:13:47.63
>>83
言ってることはわからなくも無いが、スコープについて言及しているのであれば、最後の一文、
>PythonやRubyといった他のLLと比較して、JSは大規模開発に向いていない。
これはおかしい。なぜならPythonやRubyのスコープは、JSよりもさらに劣っているから。
特にPythonはスコープ内での代入の有る無しでスコープが切り替わる。
この前代未聞なカス仕様を擁護できる奴は誰もいない。マジでひどい。
3.0でnonlocal追加したときに、このカス仕様も修正すればよかったのに。
nonlocalがあるなら、代入の有る無しでスコープが切り替わるカス仕様は要らないわな。
88:デフォルトの名無しさん
12/08/13 12:14:01.62
>>85
お前それサバンナでも同じこと言い切る覚悟あるの?
89:デフォルトの名無しさん
12/08/13 12:16:12.13
すでにJSはブラウザ上の実装が全世界で広がっているから、
Pyhtonのような思いきって後方互換性を切り捨てるというような
言語仕様の変更や拡張は無理だろうね。
言い換えると、今後とも言語仕様の発展性は見込めない。
90:デフォルトの名無しさん
12/08/13 12:17:06.52
>>86
けどそれだとちょっとした小さな使い捨てスクリプトを書く時に
varをつけるかつけないか悩む事にならね?
使い捨てスクリプトとして書いても、後からコピペして別の場所で使う可能性も考えると
varつけなきゃいけない気もしてくるし
jsのサンプルってみんなそうなってる気がする
俺の気のせいじゃなければjsって
大規模プログラム向いていないし、小規模スクリプトも向いてなくね?
91:デフォルトの名無しさん
12/08/13 12:36:27.32
>>90
外のスコープの変数にアクセスする場合は、つけないし、
そうじゃない場合はつければよい。何も悩む必要は無い。
変数の最適なスコープは常に一つしかないのだから、それに準じればよい。
外のスコープで同名の変数が有るか無いか気を配らなければならないRubyや、
代入の有る無しでスコープが切り替わってしまうPythonなんかに比べれば、
遥かに単純で、考えることは少ない。
スコープ以外のことに関してで、RubyやPythonを持ち上げて、JSをこき下ろす事は結構だけど、
ことスコープに関しては、それは無理。
ただ、JSのスコープの仕様が特に優れているというわけでもないが。
RubyとPython、特にPythonの仕様が異端で、どうかしているってだけの話なので。
JSのスコープのやり方は他の言語でも見られるスタンダードなものだし、
当たり前のことを当たり前にやってるだけ。
難点を挙げるとすれば、ブロックスコープが無いことか。まぁRubyやPythonにも無いんだけどね。
92:デフォルトの名無しさん
12/08/13 12:44:16.41
ただ単にvarかくのが面倒くさいって話だよ
変数宣言が必要になる時点で小さなスクリプトを書くのにjsは向いていない
かといって
>結論から言うと、言語設計時に大規模開発を想定していた
>PythonやRubyといった他のLLと比較して、JSは大規模開発に向いていない。
こういう事情もあるから大規模開発にも向いていない
あ、ゴミか^^;
rubyを知らない知ったかゴミカス野朗みたいだけど、rubyにブロックスコープはある
93:デフォルトの名無しさん
12/08/13 12:48:57.94
>rubyを知らない知ったかゴミカス野朗みたいだけど、rubyにブロックスコープはある
他の言語で言うところのブロックスコープだ。
94:デフォルトの名無しさん
12/08/13 13:18:03.83
君の知識レベルで他言語ディスるの無理
95:デフォルトの名無しさん
12/08/13 13:46:22.71
初心者死ね
96:デフォルトの名無しさん
12/08/13 16:52:09.34
hirata-create.toypark.in
97:デフォルトの名無しさん
12/08/13 17:28:35.80
.NET,ASP,PHP,javaこの辺の言語を何れもやれって会社は大した技術者が居ない糞会社
98:デフォルトの名無しさん
12/08/14 07:24:16.04
Lispのスコープも最初は問題があったがSchemeで解決した
Smalltalkの影響を受けた言語は今でもスコープがおかしい
99:デフォルトの名無しさん
12/08/14 07:55:53.88
>>98
Prologにスコープはないな。
100:デフォルトの名無しさん
12/08/14 08:14:25.83
>>99
繰り返しは?
101:デフォルトの名無しさん
12/08/14 08:53:56.63
Prologにはブロックが無いよな
Cでも if (foo && bar && ……) return 1; のように書ければ{}はほぼ無くなるし
102:デフォルトの名無しさん
12/08/14 08:54:26.78
スコープについてはRubyもPythonもPHP大きな差はないかな。
ブロックスコープなのはPerlだけでしょ。
それでもJSの場合、名前空間もなければClassもないので、一番分かりづらいというのはあるね。
103:デフォルトの名無しさん
12/08/14 09:04:12.85
>>98
どうおかしいの?
104:デフォルトの名無しさん
12/08/14 09:16:09.79
>>100
繰り返し構文がないのだから、「ない」と言い切っていいんじゃないか。
仕様が「繰り返せ」の場合は再帰で表現するのだが、これも、繰り返しとも
読める、くらいの解釈でいい。節と節がバラバラに主張していて先ずその主張の
核心を「宣言的に」読み取るのがPrologなのではないか。仕様の繰り返しを陽に
するには、述語名で「・・・を繰り返す」とはっきり述べるのが一番よいだろう。
105:デフォルトの名無しさん
12/08/14 09:33:09.22
>>103
RubyもPythonも大きな差はないとか言われてもスルーしてる時点でおかしいだろ
106:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/08/14 10:20:58.13
あーそれは擬似コードだから。
PythonとRubyとJSでそれぞれ記述が違うので、
{{}}で、ネストスコープ一般を表現したってだけ。
108:デフォルトの名無しさん
12/08/14 10:28:50.69
JSのスコープのネストは関数スコープで作る前提の話なのか
たしかにブロックのスコープとは書いてないね
109:デフォルトの名無しさん
12/08/14 10:59:07.14
うんこな言語集めてどっちがマシとかマジうけるわ
マトモな言語使いたかったら静的型付け関数型言語でも使ってろ
110:デフォルトの名無しさん
12/08/14 11:15:01.64
>>109
スレタイ嫁
111:デフォルトの名無しさん
12/08/14 11:20:59.96
Javascriptを読み書きしてると function() がゲシュタルト崩壊する
112:デフォルトの名無しさん
12/08/14 12:17:19.67
Perlよりマシといえば大抵のことが許される雰囲気があった
実際にはPerlに勝ったとか負けたとか考えない言語のほうがマシだった
113:デフォルトの名無しさん
12/08/14 16:44:44.54
javascriptとsmalltalkのうんこさはそっくり
114:デフォルトの名無しさん
12/08/14 22:46:09.32
# C
1 for()
2 {
3 コード
4 }
# ruby
1 map do
2 コード
3 end
do ~ endより { } のほうが、読みやすいことが分かった
115:デフォルトの名無しさん
12/08/14 22:52:33.16
>>113
smalltalk風の開発環境でDOMやhtml5を弄れるruby処理系なんてあれば最強じゃね?
116:デフォルトの名無しさん
12/08/14 22:58:15.05
Smalltalk処理系を流用した
Ruby処理系(MagLev)ならあったが……
117:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/08/15 00:44:10.32
codejamってjavascriptだけハブられてるのね
PHPからclojureまであるのに
119:デフォルトの名無しさん
12/08/15 07:29:06.13
JSの良さは、熱心なファンがいないってところでもあるからな。
勝手に広まって勝手に定着したから。
120:デフォルトの名無しさん
12/08/15 08:37:53.53
Javascriptのファンなんて希少種だろ
他言語からJavascriptへコンパイルするのが流行り
直接Javascript書くのは低能
121:デフォルトの名無しさん
12/08/15 09:00:24.91
>>120
定着しないのが特徴かな。実行環境が不安定過ぎた。
一時熱中して、そして去っていく。だから、プログラマ数も増えない。
122:デフォルトの名無しさん
12/08/15 09:31:59.66
>>120
今後は、これまでの軽量言語を抑えて最大になると思うけど
githubは既にjsの登録数がrubyを越えている
そして、熱心なファンは海外ではninjaだとか言われてるみたいだぞ
123:デフォルトの名無しさん
12/08/15 09:42:35.15
>>121
TIOBE INDEX がそれを物語っているね。みんなJSはもっと
使われてるでしょって言う。使ってみた人の数は多いが、
現時点での活性はやはり検索数のようなものに出てしまう。
124:デフォルトの名無しさん
12/08/15 11:16:18.20
jsがどこで流行ってるのかわからない
あれがブラウザ以外で使えると思ってる子はちょっとな
ブラウザ用に作られてる言語だからそれを外に引っ張り出してきても
コーディング自体が楽になるようなシンタックスシュガー系の拡張は何もやってくれないと思うよ
そんな言語で頑張りたければどうぞ
125:デフォルトの名無しさん
12/08/15 11:26:01.35
>>124
Ajaxは流行ったと思うけど、それでもダメだった。きびしいですね。
126:デフォルトの名無しさん
12/08/15 11:29:37.61
ここはどんだけガラパゴスですか
127:デフォルトの名無しさん
12/08/15 11:33:37.84
どうであれ、ブラウザでは生き残るから、
流行り廃りに関係ない、息の長い言語になるだろうね。
128:デフォルトの名無しさん
12/08/15 11:39:35.25
>>126
URLリンク(www.tiobe.com)
129:デフォルトの名無しさん
12/08/15 12:01:49.91
まあブラウザに多言語乗っける流れがくるよ
その時がjsの終わり
130:デフォルトの名無しさん
12/08/15 12:17:02.89
Googleが乗せようっていうとMSは嫌だって言うだろうし、
MSが乗せようっていうとAppleが嫌だって言うだろうし、
なかなか標準の規格に入らないんじゃないかね。
別に規格外でも、互換性糞食らえで乗せたきゃ勝手に
乗せればよいんだが、特定のブラウザでしか動かないのでは
普及するわけ無いし。
やっぱり足並み揃えない取って事で、
新バージョンのJSが乗っかって終わりでしょう。
131:デフォルトの名無しさん
12/08/15 12:26:28.68
>>129
今以上にカオスになるな
クロスブラウザ対応不可能になる
132:uy
12/08/15 13:14:53.16
これから苦労してjsをマシな言語にさせていくよりは他言語入れたほうが早い
133:デフォルトの名無しさん
12/08/15 13:16:51.90
たとえそうでも、他の言語をねじ込むのは無理。
Appleが提案してもGoogleとMSは反対する。
134:uy
12/08/15 13:30:47.00
ruby2.0はChromeで動く可能性が高い
135:デフォルトの名無しさん
12/08/15 13:40:46.02
はぁ、NaCLね。はいはい
136:デフォルトの名無しさん
12/08/15 14:10:15.96
またuyがRuby関係のスレをage荒らしてるな。
議論に負けるといつもこれだ。
137:uy
12/08/15 14:18:24.05
IronRubyは存在する
IronJavaScriptは存在しない
138:デフォルトの名無しさん
12/08/15 14:23:07.71
.NetならC#だろ。バカじゃね。
同様にブラウザで動かすならJSだがな。
RubyはPythonともろに食い合う不幸な運命。
139:uy
12/08/15 14:25:59.58
えっ
URLリンク(ynupl.com)
こういう使い方だと思うけど
なんだと思った?
Scala(笑)がJavaのクラスを継承できます(キリッ)とかいってたけど
それと同じ
140:デフォルトの名無しさん
12/08/15 14:33:23.30
まずさ、Rubyを普及させたいのなら、何かツールを作ったら?
C言語はOSを作るために作った言語だし、
JSはネスケ社がブラウザ作る片手間に作った言語だし、
JavaはJavaVMと一蓮托生だし、
C#は.Netのために作った言語。
だからさ、Rubyも普及させたいのなら、marzに頼んで、
社会の基盤になってしまうような、革新的超便利ツール作ってもらって、
その組み込みスクリプト言語としてRuby乗せれば?
言語だけ作って後はポイ投げってのはダメ言語の典型なんだよ。
むしろツールの作成を本業とし、そっちの普及を目的とすべし。
言語開発なんかは、必要に迫られて、傍らでするぐらいでよい。
普及してて人気のある言語はほとんどそう。
ツールに引っ付いて勝手に広まった。
141:デフォルトの名無しさん
12/08/15 14:36:53.30
Rにくっついて広まるかも。
URLリンク(shop.oreilly.com)
142:デフォルトの名無しさん
12/08/15 14:40:36.21
>>137
えっ
URLリンク(ja.wikipedia.org)
143:デフォルトの名無しさん
12/08/15 14:43:17.24
>>140
元がPerlに不満を持ったMatzが書き上げたオレ言語がRubyなので
実際今でも一番多い使い方が
たぶんシェルスクリプト・Perl・make辺りの代替でしょ
プロダクト未満の小物が本来の主戦場
ただ、何か知らんが一部のハッカーの琴線に触れるものがあるらしく
RailsやらRedmineやらMetasploitやら
一線級のソフトも出てきた、というのがここ5年ぐらいの話
144:デフォルトの名無しさん
12/08/15 15:07:36.87
(*´・∀・)(・∀・`*)ヘー
145:uy
12/08/15 15:10:21.84
Rubyはまだまだ歴史が浅い
146:デフォルトの名無しさん
12/08/15 15:17:03.87
Rubyはなんでdoに|つけるの?
147:デフォルトの名無しさん
12/08/15 15:19:13.66
たしかJavaと同時期のリリースだったよね。
148:uy
12/08/15 15:23:41.39
どうしてこんなに差がついたのか。
149:デフォルトの名無しさん
12/08/15 15:39:44.61
>>146
パイプでブロック引数をはさまないと、
それがブロック引数なのか、
単に式としてそこにあるのかが区別できない
150:uy
12/08/15 15:42:23.84
クソ仕様ですみませんwww
151:デフォルトの名無しさん
12/08/15 15:46:24.88
>>149
pythonみたいな
for t in list:
みたいにできなかったの?
絶対にこっちのほうがわかりやすいと思うんだけど||でかこったら特殊な演算やってそうじゃん
152:uy
12/08/15 15:48:47.94
>ただ、何か知らんが一部のハッカーの琴線に触れるものがあるらしく
ていうか、何で分からないのか分からない
最初から最後までオブジェクトで出来てる時点でさ
if true
5
end.times do | n |
p n
end
こう、IFの戻り値さえそのままメソッドチェインで使えるんだけど
153:デフォルトの名無しさん
12/08/15 15:49:51.63
>>151
for t in list; end という構文も最初から存在していますけど、なにか?
154:デフォルトの名無しさん
12/08/15 15:54:31.43
>>152
Rubyにおいて if や case といった条件分岐は
文(statement)ではなく式(expression)だから
これはSmalltalkも同じ
手続き型言語として見れば異端だけど、
関数型言語として考えれば実に自然なプログラミングができる
155:デフォルトの名無しさん
12/08/15 16:03:00.24
>>153
なんであんまりrubyではその構文使わずに使わずにeach doするの?
156:uy
12/08/15 16:22:03.27
for文()よりもeachの方がメソッドチェインできて最強だからだよ
157:uy
12/08/15 16:23:28.48
メソッドチェインってなにがいいの?
158:153
12/08/15 16:26:13.52
>>155
おそらく列挙オブジェクトへブロック付きメッセージを送るという
Smalltalk流のオブジェクト指向スタイルが好まれるからだと思う
for構文は手続き型スタイルであり、PerlやPythonから移ってきたばかりの
Ruby初心者は、最初for構文を使うけど、Rubyを深く知るにに従って
(forよりも柔軟な)オブジェクト指向スタイル、つまりRubyらしい
プログラミングスタイルを身につけていく
159:uy
12/08/15 16:39:40.59
メソッドチェインの有用性から説明しないとダメな奴がいるの?
160:153
12/08/15 16:42:30.15
>>157
メソッドチェインに関しては過去スレで話題になったけど、
最大の利点は左から右へと流れる、自然に読み取れるコードが
書けることだと思う
161:デフォルトの名無しさん
12/08/15 16:42:44.79
柔軟な例とかない?
162:uy
12/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
12/08/15 17:05:47.91
>>161
たとえば「あるリストを選別してソートして計算して書き出す」という
お題の場合、以下のような破壊的代入の無い流れるようなコードが書ける
list.select { .... }.sort { .... }.map { .... }.each do; .... end
もしRubyにfor構文しか存在しなければ、一時変数をゴリゴリと更新していく
ループ処理を並べた典型的な手続き型コードになる
164:uy
12/08/15 17:19:49.47
つまり、書き方がちょっと変わっただけである。
165:uy
12/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
12/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:デフォルトの名無しさん
12/08/15 17:28:58.74
>>> [val*(2+idx) for idx,val in enumerate(sorted([3,2,1]))]
[2, 6, 12]
メソッド入れ子でもいいんちゃう?
168:153
12/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:デフォルトの名無しさん
12/08/15 17:53:53.31
読みやすさで言えば、一時変数を用意するやり方だろう。
170:デフォルトの名無しさん
12/08/15 17:58:45.01
それはペチパー君が慣れてないだけです
171:デフォルトの名無しさん
12/08/15 18:05:30.28
慣れ言い出したら、それで全て解決だな。
172:デフォルトの名無しさん
12/08/15 18:07:20.33
自転車こぐのも慣れが必要だよ
173:デフォルトの名無しさん
12/08/15 18:08:42.47
>>168
どうみてもPythonのほうが読みやすい
174:デフォルトの名無しさん
12/08/15 18:15:01.60
.map{|x| x*2}.
みたいに続いていく構文が若干分かりにくいんだよね
{}で囲まれてると関数に見えるし
||も引数なのかなんなのか謎だし
まあ慣れなんだろうけど
175:153
12/08/15 18:21:38.11
>>173
>>168のRubyコードを第三者へ説明しようとしたら
リスト定数をソートしてから添字付きで列挙し、各要素の計算値で写像する
と、左から右へと流れるコードの構成に沿って記述できる
これはトイプログラムに限らず、>>166のような長く大きなコードでも同じ
さて、>>167を第三者へ説明しようとすれば、どんな文章になるかな?
176:153
12/08/15 18:25:51.31
>>174
関数に見えるというか、無名関数という関数そのものだよ
lambdaのような予約語が省略されているだけ
177:デフォルトの名無しさん
12/08/15 18:40:16.04
だから、分かりやすいのがよいなら、
一時変数用意すればよいだろ。何の説明も要らなくなるよ。
178:uy
12/08/15 18:46:19.62
はーーー ばぐった
Rubyごみかす
179:デフォルトの名無しさん
12/08/15 18:46:32.63
短くて分かりやすいのがベストだよね!
180:デフォルトの名無しさん
12/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
12/08/15 19:14:29.25
>>177
一時変数は悪ではないし、否定しないよ
実際に実用的なプログラムでは、あまりに長いメソッドチェーンを
途中で切って、間に一時変数を入れることがある
ただし、一度代入したら二度と更新しない
問題は変数の「破壊的代入」
たとえば>>162の最後にあるforを使った手続き型スタイルでは、
最初にリスト変数とループ変数に初期値を代入した後、
forループ内でこれら変数をゴリゴリと更新(破壊的に代入)している
これが可読性の悪化とコード品質の低下をまねく要因
なお破壊的代入の無さは、専門用語だと「参照透明性」と呼ばれる
182:デフォルトの名無しさん
12/08/15 19:25:04.95
破壊代入が嫌いなら、手続き型言語の世界から去ってもらうしかないね。
表面のコードに表れて無いだけで、結局mapの中で破壊代入しているのだから、一緒だよ。
書いてある場所が違うだけで、本質的な動作が同じなのだから、危険度も同じ。
183:uy
12/08/15 19:34:44.27
ライブラリや言語処理系側に破壊的操作をさせるのと、
自分で直に破壊的操作を行う処理を書くのは全然危険度が違うよ
184:デフォルトの名無しさん
12/08/15 19:39:26.70
だったら、関数型言語の参照透過性のメリットなど何も無いって事だな。
破壊的代入は全てライブラリにやってもらえば安全なのだから。
185:uy
12/08/15 19:43:25.26
頭悪いね
186:デフォルトの名無しさん
12/08/15 19:45:30.24
>>114
ブロック内の処理が一つの場合は{}で複数処理はdo end がいいってじっちゃが言ってた
187:uy
12/08/15 20:20:56.63
長く書くとわかりやすいって考える奴居るよなw
数学でも長い式を
一時変数に代入するのにな。
188:デフォルトの名無しさん
12/08/15 20:22:00.55
do | o |
ってやったら外人に笑われた
なんで?
189:uy
12/08/15 20:38:54.52
キチガイなんじゃね
190:デフォルトの名無しさん
12/08/15 21:01:43.68
>>188
lolはlaugh out loudlyで(笑)と同じように使われるから、笑えよってことだね。英語圏のコミュニティ行くとよくあるよ。
191:デフォルトの名無しさん
12/08/15 21:10:40.01
内包表記が読み難いとか言ってる奴は
数学の素養が無いって自己紹介してることに気付いてないの?
かっこわるいから控えた方が良いよ
192:デフォルトの名無しさん
12/08/15 21:13:01.31
集合のアレだと気づくのに半年かかったお
193:uy
12/08/15 21:19:39.91
>>191
でも、実際に読みづらいんだろう?
194:デフォルトの名無しさん
12/08/15 21:27:25.15
ブロック記法は任意の(ただし関数引数は一つだけの)
高階関数を記述できる分だけ汎用性があるが、
mapとかfilterとかの組み合わせに関してはリスト内包表記のほうが簡潔になりうる
細かい優劣はあれど、matzは内包表記みたいな専用構文を用意するのを嫌った
PythonあるいはHaskellその他のように、頻出する記述に糖衣構文を与えるのは間違っていないと思うが、
Rubyはそれよりもブロック構文による均質性を採ったという事
195:デフォルトの名無しさん
12/08/15 21:40:16.38
なんでSmalltlakみたく{ |x| x*2 } をファーストクラスにしなかったの?
そしたらもっと簡潔にも均質にもなったのに。
196:デフォルトの名無しさん
12/08/15 21:50:52.54
Pythonの内包表記はプログラミング独特の手続き的なところをない交ぜにしてるから
数学の内包表記は読みやすいからPythonのも読みやすいみたいな論法はちょっとしっくり来ないな
197:153
12/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
12/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
12/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:デフォルトの名無しさん
12/08/15 22:07:42.58
>>197
HaskellもPythonも使えるから
どっちも楽勝で読める
あとHaskellならそのケースだと内包表記じゃなくて map fn xs だな
短いし読み易い
201:デフォルトの名無しさん
12/08/15 22:08:07.08
>>195
確かGroobyはそういう仕様だったから、整合性は何とかなるんだろうけど
実際問題として誰も困ってないんじゃないの
ブロックがリテラルとして書けたとしても、どっちみちブロック付きメソッド呼び出しの時は
ブロックを特別扱いする構文を認めることになるから、特段簡潔になるというほどでも……
いわゆる無名関数を直接操作したいならブロック(Procオブジェクト)ではなくてlambdaが適当で
lambdaに関しては1.9から糖衣構文が入った
202:uy
12/08/15 22:09:14.11
Rubyは色々考えながら作っていってる感はあるよね
現在のrubyに>>197
こういうの導入すれば、開発効率は一時的に上がるけど
低脳プログラマは優秀なプログラマが管理してやらないと
意味不明なコード書いて自滅するから
全体パフォーマンスを見れば入れるべきでないものもある
203:デフォルトの名無しさん
12/08/15 22:13:47.89
>>197
どっちにしても、酷いコードだ。
204:デフォルトの名無しさん
12/08/15 22:16:27.85
メソッドチェインって書いた後から付け足す事って結構あるからね
イテレータやループの書き方は統一されてたほうが良い
205:デフォルトの名無しさん
12/08/15 22:17:50.65
この辺りはある程度個人の感性だけど
内包表記が多段ネストし始めるのはさすがに勘弁して下さいっていうか
読むのも書くのも面倒じゃない?
Haskellはまだwhere節で後ろに押しこみ直すことでトップダウンに読めるから
場合によっては許せるかなあと。少なくとも適切な変数名が条件w
206:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/08/15 22:31:21.07
>>201
どうして? ブロックがファーストクラスなら yield や &block なんて小細工いらなくなるし、
複数のブロックを引数として簡単に渡せるから表現の幅も広がるし、
機能も意味もずっと簡潔になると思うよ。
208:デフォルトの名無しさん
12/08/15 22:32:31.13
内包表記とか参考演算子なみのウンコやん。
Pythonってそんな誰得非効率機能が特徴なの?ウンコやん。
ついでにRubyもウンコやん。
ラムダ式とかevalが使えんコンパイル言語がなんちゃってevalを実装してるようにしか見えん。ウンコやん。
209:デフォルトの名無しさん
12/08/15 22:42:15.44
>>207
もっと具体的に実現例を出してもらわないと
よく分からない
210:デフォルトの名無しさん
12/08/15 22:48:10.24
とりあえずsmalltalkは演算子優先順位すらないクソ言語だから
このスレで議論する価値無い
Java以下のウンコの中のウンコ
211:デフォルトの名無しさん
12/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
12/08/15 22:53:01.74
初心者は消えろ
213:デフォルトの名無しさん
12/08/15 23:10:42.33
みんな消えたか…
214:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/08/16 00:05:36.35
-> をタイプする手間すら億劫っていうのは
ちょっと病気ですよ
Rubyってそういう言語かもしれないけど
216:デフォルトの名無しさん
12/08/16 00:06:27.09
>>204
付け足す事もあるけど、途中の処理の内容を変えたり、途中で処理を分岐する事もあるよね?その場合、一時変数を使ってる方がやりやすくない?
217:デフォルトの名無しさん
12/08/16 00:11:36.22
>>143
Perl代替で一番成功してるのはPythonじゃない?
Rubyの場合、作者の思惑はともかく、現状はほぼRails専用と言っていいのでは。
Railsを便利に使うためのツールはいろいろあるけど、OSだったりミドルウェアから使うようなRuby製のツールってPerlやPythonと比べて全然無いでしょう。
218:デフォルトの名無しさん
12/08/16 00:18:16.38
>>214
>- 複数のブロックをとるメソッド呼び出しを簡潔に書ける
そういう部分でメソッド引数括弧の省略を使うのは筋悪でしょ
現在のRubyのコーディングスタイルでも、引数がある場合は原則省略しないのが主流
あるいは括弧を省略しない場合、確かにルールは単純だけど見栄えがよろしくない
hoge({|x| p x })
そしてブロック構文の仮定として
大部分の高階関数は関数引数を一つしか取らないという
観察結果があるわけだから、一つに特化した構文でも十分
219:デフォルトの名無しさん
12/08/16 00:35:02.92
>>217
ここで小物と表現していたのは、ツールと呼ぶのもおこがましいほど小さい
日常の雑務を処理するような小規模スクリプトだよ。ワンライナーも含む
例えばRubyに大量に残ってるPerl譲りの特殊変数とか、
外部コマンドのためにリテラルとか、インタプリタの変な起動引数とか、
色々あるが、おそらく全部そういう小物のためのもの
220:デフォルトの名無しさん
12/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
12/08/16 01:00:12.30
俺はrubi使いだけど、ちょっとrubyの考えは改めようかな
言語が複雑なことやってるから、実装もバグ取るのも大変なんだろうし
俺が普通じゃないコード書いてるからなんだけど
バグ多すぎてワロタwwww
今日だけで2個踏んだったwwww
なんでだろ、世界でずいぶん使ってる奴いるはずなのに、
俺はもういままでrubyのバグには自分で出したのだけで少なくとも10個以上
どうなってるのこの言語 とりあえずlambda周りとハッシュ周りに何かがある・・・
222:デフォルトの名無しさん
12/08/16 01:02:21.44
それがパーサのバグなら諦めろ
Rubyのパーサはどうもならん
223:デフォルトの名無しさん
12/08/16 01:11:31.94
rubi使いはフリガナふってろ。初心者って自分のバグを人のせいにするよな。
224:デフォルトの名無しさん
12/08/16 01:19:03.05
>>218
201,209が「簡潔にならない」「具体例がないと分からない」というから挙げた例に
横からしゃしゃり出てきて一例だけピックアップして筋悪とか十分とか
結論ありきの難癖つけるってなんなのあんた?
225:uy
12/08/16 01:20:06.45
> なんなのあんた?
俺俺。俺だよ。
226:デフォルトの名無しさん
12/08/16 01:29:22.60
コミュ障です。
227:uy
12/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:デフォルトの名無しさん
12/08/16 01:35:09.09
>>227
中級者はバグを回避するコード書くのがあたりまえっえこと。
229:uy
12/08/16 01:35:37.63
>>227
[BUG]というのは
テメーのバグっていう意味だよw
230:uy
12/08/16 01:36:32.34
>>227
あ,ごめんハッシュのほうは両方nilではないわ
でも何か動作おかしいのは事実
231:デフォルトの名無しさん
12/08/16 01:42:31.92
そりゃお前、コンテナをイテレートしている最中にコンテナいじったら、
危ないだろうJK。Rubyに限らずどの言語でもご法度。
232:デフォルトの名無しさん
12/08/16 01:43:59.81
>>224
この一例が重要だから214が例示して、218が反論したんだよ
もしブロックが単独のリテラルだったなら
1. Procを簡潔に記述できる
2. ブロック構文に関わる一連の糖衣構文(yield、&block、)が
通常のメソッド引数括弧の省略という形で統一的に記述できる
3. またこの枠組みでは複数の関数引数の記述も自然にできる
それに対する反論が
1. 関数型スタイルを使いたいならProcではなくてlambdaでいいじゃん(糖衣構文がある)
2. メソッド引数括弧の省略に頼った記法は良くないとされている
逆に省略しないと記述が煩雑になる。つまり専用構文を用意するのがベター
3. 複数の関数引数は出現頻度が低いことが分かっているから重要でない
むしろ一引数に特化している事が重要 →再反論:関数合成のような例は?
っていう議論なんだから
233:uy
12/08/16 02:12:27.19
もういいじゃんruby最強なんだから
バグがあっても使う価値があるくらいには最強
234:デフォルトの名無しさん
12/08/16 08:15:45.11
日本人の韓国旅行終了! 三井住友、韓国旅行者向けの新カード発行延期
スレリンク(poverty板)
韓国旅行者向けの新カード発行延期 三井住友カード
三井住友カードは15日、韓国に旅行する日本人向けに予定していた新たなカードの発行を延期すると発表した。
提携する韓国のカード会社と22日にソウル市内で記者発表会を計画していたが、これも延期する。
韓国の李明博(イ・ミョンバク)大統領の竹島上陸や対日批判などを考慮し、「今サービスを始めるのはふさわしくない」(広報室)
と判断したという。
このカードは、旅行前に日本円で入金しておけば、韓国のお店で韓国ウォンでの支払いができるプリペイド式で、9月上旬から
発行する予定だった。記者発表会は、日本でも人気の高い韓国人俳優らが出席する計画だった。
URLリンク(www.asahi.com)
235:153
12/08/16 10:04:35.58
>>211
ん、最終行にはリスト内包表記が見えるけど、気のせいかな?
それはさておき、Pythonでは「ごく普通に」関数を定義して適用するのに対して、
Ruby(および関数型言語)では「ごく普通に」ブロックや無名関数を使って
シンブルな式として表現できる、ということになった
また当たり前だけど、>>211のような関数を定義するコードはRubyでも書ける
これは>>197,198で述べたように、関数型言語風プログラミングにおいて
局所宣言が無いというPythonの欠点、そしてRubyの優位性を示している
236:デフォルトの名無しさん
12/08/16 11:03:14.55
無名関数のあるJSの勝利ですね。
237:デフォルトの名無しさん
12/08/16 11:05:52.40
>>235
Rubyは関数内関数を素直に定義できないじゃん
Proc と lambda の違いとかキモイし
どさくさにまぎれて関数型言語と一緒にすんなよ
238:デフォルトの名無しさん
12/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
12/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:デフォルトの名無しさん
12/08/16 12:30:36.27
>>239
WebProg
URLリンク(kohada.2ch.net)
241:238
12/08/16 12:32:19.66
>>240
thx
242:uy
12/08/16 14:10:29.16
rubyは[]でかけるLISPとしても使えるんじゃなかった?
メソッド揃えば完全変換できるかもよ
procのlambda違いは有りなんだよ
rubyは同じに見えて微妙に違う動作をするメソッドが数多く存在する
それだけ細かい調整が標準ライブラリで効くってこと
243:153
12/08/16 14:13:16.73
>>237
>Rubyは関数内関数を素直に定義できないじゃん
エッ!、Rubyは普通に関数内関数を定義できるよ???
以前(1.8)は関数内関数のスコープに問題があったけど、今(1.9)では解消されたし
・メソッド定義のネスト - Ruby 1.9.3 リファレンスマニュアル
URLリンク(doc.ruby-lang.org)
というか、OOPLであるRubyでは、プライベートメソッドとして定義するのが一般的で、
関数内関数はまず目にすることはない
しかも(>>211のPyhtonのような)他LLでは関数定義を「普通」に使うけど、
Rubyならブロックがあるから一度しか適用しない関数は式の中に埋め込むのが「普通」
つまり、(関数内関数を多用せざるをえない他LLと違って)関数内関数を使う頻度は少ない
>Proc と lambda の違いとかキモイし
確かにProcとlambdaの微妙な差異は分かりづらいよね
でもRubyにはブロック構文があるから、(Procやlambdaのような)明示的な無名関数宣言を
使う頻度は比較的少ないし、使うケースでもどちらか一方を使えば済むことが多い
また、言語の微妙な弱点を避けて、良い点を引き出すことに注力することが
(Rubyに限らず)中級プログラマのたしなみの一つだと考える
>どさくさにまぎれて関数型言語と一緒にすんなよ
え、一度も「Rubyは関数型言語である」とは言ってないけど.....???
「関数型言語風プログラミングには(他LLよりも)Rubyは明らかに優れている」と主張している
244:デフォルトの名無しさん
12/08/16 14:25:57.61
>>243
> エッ!、Rubyは普通に関数内関数を定義できるよ???
はあ?じゃあ何で関数内関数が外から見えてんだよ
URLリンク(ideone.com)
245:デフォルトの名無しさん
12/08/16 14:42:18.11
> つまり、(関数内関数を多用せざるをえない他LLと違って)関数内関数を使う頻度は少ない
関数型言語でも関数内関数を多用するけど...?
「関数型言語風プログラミング」って何?
それってただの「Ruby風プログラミング」なんじゃないの?
246:uy
12/08/16 14:43:56.36
rubyの仕組みがなんにもわかってないんだな
それは結局selfが省略されているに過ぎない
rubyはすべてがオブジェクトであり、インスタンスは特異メソッドをもつ事が出来る
self.define_singleton_method :uy do
p :uy
end
お前らの大好きなシングルトン
でもこの設計はゴミカスだな
俺様個人の意見を言わせてもらうならdef内のdefは使わないほうがいいよ
普通にlambdaで ->{ } 書いたほうが短いんだからそっち使えばいいじゃん
247:uy
12/08/16 14:48:03.05
>>246
すいません、思いっきり間違っていました忘れてください 旅にでます
248:153
12/08/16 14:50:55.63
>>244
わざわざideon上のコードを引用しなくても、Rubyの振る舞いは>>243で示した
リファレンスマニュアル「普通のメソッド定義式と同じ」の通りだよ???
確かに、理想的には内側のメソッドが外部から隠蔽されたほうが望ましいことは認める
これが>>211のPythonコードのように、関数定義を多用するのが「普通」、
あるいは関数定義を多用「しなければならない」言語であれば、致命的な欠陥になる
でも>>243で述べたように、Rubyでは関数内関数の必要性がほとんど存在していないんだ
もしも可能であるならば、ブロックやプライベートメソッド定義では読みづらかったり
冗長だったりするけど、関数内関数であれば素直に表現できるコード例を示してほしいなあ...
249:デフォルトの名無しさん
12/08/16 14:57:03.42
rubyはそこら中が関数といえば関数だからね
do ~ endって、でてきたらそれ全部関数だよ
250:デフォルトの名無しさん
12/08/16 15:03:34.35
だから関数型言語では関数内関数を多用するって言ってるのに...
関数型言語と違うスタイルなんだから「関数型言語風プログラミング」とか言うなよ
251:デフォルトの名無しさん
12/08/16 15:07:46.32
> 確かに、理想的には内側のメソッドが外部から隠蔽されたほうが望ましいことは認める
理想的にはじゃなく、ここが一番大事なところ
252:uy
12/08/16 15:08:18.16
proc
Proc.new
lambda
->{ }
def
define_method
define_singleton_method
Module.new / Class.new / Struct.new
こんくらいかな?メソッド内で関数のようなものを定義する方法
動作違うものが、これだけあるんだから動作調べて好きなの使えよ?
defしか使えないバカなの?
253:デフォルトの名無しさん
12/08/16 15:23:14.80
>>248
> もしも可能であるならば、ブロックやプライベートメソッド定義では読みづらかったり
> 冗長だったりするけど、関数内関数であれば素直に表現できるコード例を示してほしいなあ...
なんだ、読みづらさや冗長さの観点で批判してたのか?関数型うんぬんは関係なく?
じゃあ>>198に比べて>>211は読みづらくて冗長だからダメって言いたいんだな?
そういうことは最初から言えよ
254:デフォルトの名無しさん
12/08/16 15:35:35.20
はよ旅立て。
255:153
12/08/16 15:41:10.73
>>245
>関数型言語でも関数内関数を多用するけど...?
うん、関数型言語では関数内関数でプログラムを構築していくのが普通だね
でもRubyはオブジェクト指向言語であり(>>243の最後で書いたように)関数型言語ではないから、
モジュールやクラスでプログラムを構築するのが普通なんだ
>「関数型言語風プログラミング」って何?
「(破壊的代入を含む)副作用を避けた参照透明性のあるプログラミング」(>>181も参照)
これは関数型言語のパラダイムと同じ
もちろん(関数内関数ではない)Rubyでは、入出力や効率(性能や資源)といった理由から
完全に参照透明性のあるコードは書けないけど、それでも副作用を極力避けたり、
参照透明性のある部分とない部分を意識的に使い分ける、あるいは副作用のあるコードを隠蔽する
現実に実用的なテキスト処理プログム開発で試したところ(全体で約20Kstep)、
8割は参照透明性のあるコードで実装することが可能だった
残る2割の部分は、トップレベルの(入出力を含む)メイン処理モジュール群と
最下層の副作用をカプセル化(隠蔽)した内部ライブラリ群になる
256:avacript
12/08/16 16:27:56.11
関数型扱えない言語は終わってるよな
rubyとか
257:uy
12/08/16 16:51:25.73
rubyは関数型プログラミングも出来て便利だよな
258:デフォルトの名無しさん
12/08/16 16:55:24.10
でもOSやミドルウエア、あるいはビジネスアプリにいたるまで
日本製ソフトのシェアはゼロに等しいよね。
259:153
12/08/16 16:57:54.51
>>250
>関数型言語と違うスタイルなんだから「関数型言語風プログラミング」とか言うなよ
うん、ググってみたら確かに「関数型言語風プログラミング」は風変わりだった
では、一般的な「関数型プログラミング(functional programing)」と改めよう
260:153
12/08/16 17:09:48.97
>>251
>理想的にはじゃなく、ここが一番大事なところ
そう、クロージャやまともなラムダ式の無いPythonのような手続き言語における
関数型プログラミングでは、関数内関数こそが一番大事だよね
Rubyはというと、(>>248で書いたように)OOPLでブロックがあるからそれほど大事じゃないけど....
261:デフォルトの名無しさん
12/08/16 17:15:09.50
ラムダの文法を def 1; end にして、
メソッド定義は
@method = def 1; end
こんな感じの文法でよかったんだよ。
func = def 1; end
こう書けばfuncはローカル変数だから外から見えないし。
同じようなものが一杯ありすぎる。
C++みたいに厳しいパフォーマンスが求められるってわけでも無いのにさ。
こんな行き当たりばったりな言語を良しとしている人は、
さぞプログラムも行き当たりばったり何だろうな。
かといって、ラムダの弱いPythonは土俵にすら立ててないのだが。
普及しててまともなLLって無いのかね。
もしJSにブロックスコープがあったなら、かなり良い言語になりえたんだがな。
262:uy
12/08/16 17:42:47.29
>>261
おいバカ
これ
lambda ↓
->{ }
これlambda
263:デフォルトの名無しさん
12/08/16 17:43:38.98
ラムダしか知らないのかよお前はw
264:デフォルトの名無しさん
12/08/16 17:48:13.46
旧世代的なラムダ脳にはリスト内包表記、イテレータ、ジェネレータ、デコレータを上手く使うPythonicなコードは理解出来ない
なんとかラムダで書こうとするのは、どの言語でもCみたいなコードを書く奴と何も変わらん
265:153
12/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: 洋書
URLリンク(www.amazon.co.jp)
>もしJSにブロックスコープがあったなら、かなり良い言語になりえたんだがな。
これは同感だね
さらに条件分岐(if や switch)が文(statement)ではなく式(expression)であることも大切だと思う
266:デフォルトの名無しさん
12/08/16 18:07:02.49
そう思ってしまうのはクロージャがないC脳だから。
内から外へのスコープを区切るものは関数しかない、という単純さが損なわれる。
クロージャがあるからそれだけでも既にややこしくなってるのに。
267:153
12/08/16 18:11:28.09
>>264
論よりコード
268:デフォルトの名無しさん
12/08/16 18:35:16.39
つまり、日本国はこの町並みを維持できる限り安泰ということだから、
大声張り上げて街中をデモ行進する人は宇宙空間にでも行って欲しい。
269:153
12/08/16 18:39:03.55
>>265のカキコの中で、最後の「>もしJSにブロックスコープがあったなら、」以降を取り消す
ブロックスコープをスコープと早合点していた
270:デフォルトの名無しさん
12/08/16 18:42:06.27
>>267
Closures in Python (part 1)
URLリンク(ivan.truemesh.com)
>(ie. use a "list comprehension" - I think it reads a bit easier than using the map/lambda).
271:153
12/08/16 18:53:18.70
>>270
リンク先を眺めたけど、これらの例というのは(説明も何も無いから)
RubyでもPyhtonでも同レベルで簡潔に書けるコードに見える
これらの例について、いかにPythonが優れているかを「>>270自身の言葉で」語って欲しい
あるいは>>197,198のように、明らかにPythonが優位性であることが分かる例を希望する
これじゃバトルにならんのだよ....
272:デフォルトの名無しさん
12/08/16 18:54:43.69
>>271
別にRubyが劣ってるなんて言ってないよ
馬鹿が譫言のようにクロージャクロージャと連呼してたから
ああ、こいつはPythonのことをあまり知らないんだなあ、と思っただけ
273:デフォルトの名無しさん
12/08/16 18:55:24.50
Pythonが優位であることが分かる例か。シェアだな。
274:153
12/08/16 18:56:07.05
>>269(>>265)を再訂正 ....orz
X: スコープと早合点していた
O: ブロックと早合点していた
275:デフォルトの名無しさん
12/08/16 18:56:16.68
なお>>197,198でPythonが明らに劣勢であることを示せてると思ってる所にも同情する
276:153
12/08/16 19:00:35.26
>>272
では、そのPythonのクロージャとやらを使って、>>211を書き直して欲しい
Pythonにはクロージャがあるから、関数定義無しに書けるよね?
277:デフォルトの名無しさん
12/08/16 19:01:46.12
>>273
それに伴うライブラリの充実とかコミュニティの活発さはあるね
278:デフォルトの名無しさん
12/08/16 19:02:19.29
そもそも関数定義無しに書けなきゃダメって
勝手にルール作ってるところがおかしい
279:デフォルトの名無しさん
12/08/16 19:02:23.31
なぜ関数を定義したらいけないのか理解できない
280:デフォルトの名無しさん
12/08/16 19:05:32.80
領空侵犯機 ロシア約68%、中国約25%、その他約7%
281:153
12/08/16 19:09:44.52
>>275
独り言かな?
282:デフォルトの名無しさん
12/08/16 19:09:59.70
153はダブルスタンダードすぎる
283:デフォルトの名無しさん
12/08/16 19:12:19.57
>>279
そりゃ明らかに面倒だろ。
いまどき、あのC++にすら無名関数やラムダがあるのに。
あの保守的なC++が取り入れたんだよ?
しかも文法を [&](int i)-> int { return i; } って糞キモくしてまで取り入れた。
今までのC風の関数のスタイルを捨ててまで、取り入れたんだよ。
今までになかったこと。それぐらい無名関数やラムダは求まれた。
int func( int i ){ return i; }
これが
auto func = []( int i ) -> int { return i; }
こんなになっちゃったんだよ。こんなに見た目が変わったんだよ。
それを受け入れたんだよ、あのC++er達が。その意味を考えろ。
284:デフォルトの名無しさん
12/08/16 19:15:38.78
>>283
いや上の例を見ても明らかとは思えないけど
別にC++erだって全ての関数をラムダ式で書くわけもなく、普通に関数定義するし
285:デフォルトの名無しさん
12/08/16 19:21:31.64
>全ての関数をラムダ式で書くわけもなく、普通に関数定義するし
普通の関数もかけるのは当たり前で、
それだけじゃつらいからラムダを導入したって話だろ。
論点ずれてるだろ。何言ってんだか。
ラムダが要らないものならわざわざ変な文法作ってまで導入するかよ。
286:デフォルトの名無しさん
12/08/16 19:23:37.43
>>285
上のはラムダで書くべき例なの?
287:153
12/08/16 19:26:19.29
>>278,279
あらゆる関数型言語であれば関数定義無しにかけるから、
それは「関数型プログラミング」の特徴の一つである、という理屈
だってPythonだけが関数定義が無ければ書けないんだから、
マイナス評価されても当然だろ?
というかさ、もしルールに不満があるならそれを最初に主張すべきだった
具体的には、>>235の指摘に対して即座に反論すればよかったのに....
いろいろゴネたあげく、技術論で反論できないからルールに不満を言うのは
カッコワルイと思うよ
288:デフォルトの名無しさん
12/08/16 19:29:06.48
>>287
つまり、実用上では何の意味もない所で優劣を競ってるのか?
289:デフォルトの名無しさん
12/08/16 19:30:21.57
昔からお題を出し続けてる奴だろうけど、出題がゴミすぎるよね
290:デフォルトの名無しさん
12/08/16 19:30:51.67
実用上問題がなければC++にラムダが導入されるわけ無いだろ。
あんな変な文法にしてまで、無理にでも導入したんだぞ。
291:デフォルトの名無しさん
12/08/16 19:36:11.33
ラムダの有用性は、このお題では1ミリも示せなくても、いくらでもあるだろ
C++がさらに糞言語化したからラムダは有用!とか言わなくてもさ
292:デフォルトの名無しさん
12/08/16 19:42:16.59
「こんな書き方も出来る、こんな書き方も!」
で?もっと身のある話はないのかよ
293:デフォルトの名無しさん
12/08/16 19:55:52.82
URLリンク(www.youtube.com)
294:デフォルトの名無しさん
12/08/16 20:14:22.38
>>287
あれ?お前>>255でRubyはOOPLだから関数内関数無くても良いんだとか
言ってなかったっけ?
関数型言語では関数内関数あるんだからRubyではdefの入れ子で
関数内関数が定義できないのはマイナス評価されても良いの?
295:デフォルトの名無しさん
12/08/16 20:16:11.07
Pythonに無名関数(複数行lambda)あってもいいじゃんと思ってたけど
[Python-ideas] a new lambda syntax
URLリンク(mail.python.org)
めぐりめぐってGuidoのコメント
URLリンク(mail.python.org)
# URLリンク(mail.python.org) のコードをもとに
ys = [Document(lambda{
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}) for x in xs]
こういうコード書く人が出てくるからやめたほうがいいね
296:uy
12/08/16 20:16:17.97
それはマイナスだよ
ゴミ
297:デフォルトの名無しさん
12/08/16 20:18:08.51
(1)Pythonのlambdaじゃ書けなくて
(2)関数を定義したら冗長になってしまうほど短い
そんな例題があればいいんだよ
298:デフォルトの名無しさん
12/08/16 20:22:49.99
153は出す御題もゴミの上に
都合の悪いレスはスルーするというゴミっぷり
ゴミの中のゴミ
299:uy
12/08/16 20:23:21.31
勘違いされやすい文法はゴミカスだ
300:デフォルトの名無しさん
12/08/16 20:24:33.39
私が改造したソース帰ってこないじゃん。
301:uy
12/08/16 20:33:38.40
ゴミだからだろ
302:デフォルトの名無しさん
12/08/16 20:38:52.33
8時半だしお家かえる
303:デフォルトの名無しさん
12/08/16 20:42:02.02
>>287
いやいや、スレ読んでみたら、>>211に対して後付けで
関数定義はダメって言い出してるけど?
後付けでルールを追加するのってカッコワルイね
304:uy
12/08/16 20:53:09.03
rubyのメソッド内メソッド定義はカス
しかしそれをマイナス点にしても最強なのだった
305:デフォルトの名無しさん
12/08/16 20:57:19.93
Rubyはひたすらendでも打ってろ
306:153
12/08/16 21:05:50.99
関数型言語としてHaskellだけを取り上げて「あらゆる関数型言語(>>287)」と言うのは
不公平だと思うから、それ以外の関数型言語のコード例について、過去スレ19,20からコピペする
なお、このコードは>>286氏ご希望のラムダ式で書く典型的なコード例となる
==== Standard ML ====
datatype 'a Option = None | Some of 'a
val ys = map (
fn x =>
let
val h = if is_first_page x then generate_header else None
val b = generate_body x
val f = if is_last_page x then generate_footer else None
in
(h, b, f)
end
) xs
同等な多言語のコード例については以下を参照
・Haskell >>197上段
・Python >>197下段および>>211
・Ruby >>198
307:デフォルトの名無しさん
12/08/16 21:10:23.55
関数型言語の話をしたいだけなんだな、こいつは
308:デフォルトの名無しさん
12/08/16 21:10:42.85
お題がクソだと散々言われてるのに
話を引っ張る空気読めないっぷりがウケるw
309:uy
12/08/16 21:15:05.50
たまに関数型言語厨が迷い込むよね
同じ奴なんですか?
310:153
12/08/16 21:19:31.47
>>294
>関数型言語では関数内関数あるんだからRubyではdefの入れ子で
>関数内関数が定義できないのはマイナス評価されても良いの?
正確には「関数内関数定義で内部の関数が外部から隠蔽されない」だね
もちろんこの点はRubyのマイナス評価であると認めるよ
また、アンカも間違いで(>>255ではなくて)>>243じゃないかな?
さらに言えば、>>297自身も(>>243,248から)引用しているように、
このマイナス評価はRubyにとっては致命的な欠点ではない
もしも致命的ではないという意見が不満ならば、
>>248の最後でリクエストしたように具体的なコードで語って欲しい
論よりコードだ
311:デフォルトの名無しさん
12/08/16 21:23:03.20
>>310
> もしも致命的ではないという意見が不満ならば、
Pythonの関数定義が致命的だって話は何時同意を得たんだ?
少なくとも>>211は関数定義で全く問題ない
せめて>>297を満たす御題くらい作れよ
論よりコードなんだろ?
312:デフォルトの名無しさん
12/08/16 21:23:21.86
>>310
Pythonユーザなら誰も書かないようなコード貼っといて論よりコードは流石になかろう
313:153
12/08/16 21:23:30.23
>>289
その「都合の悪いレス」とやらのレス番を書きなさい
そうすれば反論してあげるよ
それとも反論されるのが怖いヘタレかい?
314:デフォルトの名無しさん
12/08/16 21:23:47.98
関数型言語としてどれが素晴らしいかって、HaskellとかSMLが素晴らしんじゃないでしょうかw
でも関数型言語スレって盛り上がらないんだよな。TIOBEのランキング見れば分かるけど
そもそも利用者が少ない。LispはまだしもHaskellとかMLとかは、マイノリティすぎる
結局、関数型言語としての評価軸って対して価値がないのかなと思う
まあノイジィマイノリティのノイジィ具合は全てのパラダイムの中で群を抜いてるだろうけど
それに対応してRuby、Pythonその他の言語にも導入されてる機能もあるし
導入された分は使える範囲で使えればいいと思うし、それで足りないなら関数型言語を使うしかないけど
そういう選択をする人が少ないのも事実で、関数型言語でなければならないという観点は間違ってる気がする
315:153
12/08/16 21:33:07.50
>>303
リスト内包表記(Haskell: >>197)にせよラムダ式(SML: >>306)を使うにしても、
関数型言語プログラマであれば「再利用されないコード断片」は
関数定義無しでも書けるのは「常識」なんだから、そんなルールはわざわざ書かなかった
今の議題は「LLにおける関数型プログラミングの適性比較」なんだよ
316:デフォルトの名無しさん
12/08/16 21:34:19.08
「LLにおける関数型プログラミングの適性比較」というスレでやれば?
317:デフォルトの名無しさん
12/08/16 21:34:28.89
えーその議題いつ決まったのーーーー!!!
さすがに突っ込ませてもらうわ。
とりあえず君は関数型言語の巣へ帰った方がよいね。
318:デフォルトの名無しさん
12/08/16 21:35:10.02
>関数型言語プログラマであれば
(笑)
319:uy
12/08/16 21:36:45.56
関数型言語でスクレイピングしたいんですけど
あ、やっぱあいいや
320:デフォルトの名無しさん
12/08/16 21:48:26.95
>>295
> I believe that the main reason
> people keep arguing for anonymous blocks (and this will never stop) is
> simply that there is **a certain segment of the programmer** population
> that is used to solving a large variety of problems with anonymous
> blocks and that **they don't want to learn how to solve each of those
> cases using the existing tools in Python.** (強調引用者)
どう考えても>>153そのものです。本当にありがとうございました
321:153
12/08/16 21:49:45.82
>>312
では、議題(>>315)に沿った「Pythonユーザなら誰でも書くコード」を提示しなさい
>>272氏がPythonにもクロージャは存在すると指摘してくれたので
>>276でコード例をリクエストしてレスを待っているんだけどな....
残念ながら、今のところ具体的なPythonコードを書いてくれたのは>>211一人だけだ
過去スレ19,20でも結局は一人だけだったし、もしかして同じ人かなあ....
322:デフォルトの名無しさん
12/08/16 21:51:22.33
俺RubyもPythonもHaskellもOCamlも仕事で使った事在るけど
こんなスレで関数型言語アピールとかアホとしか思えん
関数型言語が好きなら黙って使ってろっての
323:デフォルトの名無しさん
12/08/16 21:52:27.55
なんでお前に命令されなきゃいかんのか分からんし
なんか前もお前の間違いを訂正したのは
「ああ、そうなんだ、ふうん。でも俺の主張は間違ってない。じゃあこのお題はどうよ?」
みたいな対応しかしなかったし、関わるだけ無駄。関数型云々について、いつまで続けるんだ?
もう結論出して良いよ。それでLLの優劣なんて何も決まらんから
324:デフォルトの名無しさん
12/08/16 21:52:32.06
覚えた言葉をすぐに使いたがる小学生。
325:デフォルトの名無しさん
12/08/16 21:53:32.53
>>321
まず議題が承認されてないじゃん
というかPythonいけてねえって主張するあなたのほうに立証責任がある
「なんでPythonで(名前つき)関数定義するのがよろしくないのか」を示すべき
326:デフォルトの名無しさん
12/08/16 21:55:05.79
315は関数型言語で遊ぼう!みたいな本が大好きな関数型マニアだってことは分かるけど
このスレで何をしたいのかは理解できない
327:デフォルトの名無しさん
12/08/16 21:57:21.87
このスレ住民は現実的な意見が多いな
関数型は効率というベクトルからは外れた趣味だもんな
328:デフォルトの名無しさん
12/08/16 22:02:23.59
Pythonディスりたければ、俺みたいに、
あの糞みたいな、ネスとスコープの仕様をつつけば良いのに。
あれだけは生粋のパイソニストでも擁護不可能だからね。
擁護しようものなら、
今になってnonlocal追加した事実に反してしまうしな。
329:デフォルトの名無しさん
12/08/16 22:02:35.37
というか、ある程度はそのプログラミング言語の用途とかが競合しないとさ
330:デフォルトの名無しさん
12/08/16 22:06:00.91
ガチでぶつかるのはPythonとRubyぐらいでしょう。
しかも外国VS国内みたくなってるから余計に。
他の言語は大体用途が被らないし、
その用途でのスタンダードを確立しているものばかりだからな。
shとJSで喧嘩するのは無理。
331:デフォルトの名無しさん
12/08/16 22:07:22.74
>>328
nonlocalの追加は、リストにする手間が省けたという意味では確かに改善だけど
スコープ自体は問題なくね。だからこそnonlocalが要るんだし
332:153
12/08/16 22:08:05.65
>>311
>せめて>>297を満たす御題くらい作れよ
え、>>197,198,306の御題は>>297を満たしているけど、何か?
> (1)Pythonのlambdaじゃ書けなくて
==> わざわざ複数の引数を渡しているから、Pythonのlambdaじゃ書けない
(タプルを使えば書けないことも無いかもしれないけど冗長になる)
> (2)関数を定義したら冗長になってしまうほど短い
==> 1カキコ内に収まるほどのコードなので、十分に短い
しかも再利用されないコード断片なのだから、関数定義が冗長なのは明らか
(Pythonの無名関数(=ラムダ式)って、一体何のために存在してるの?)
また、お題について不満があるなら、それを最初に(>>198の直後に)主張しないとね
散々ゴネたあげく後出しでブーブー文句を言うのはカコワルイよ
333:デフォルトの名無しさん
12/08/16 22:08:32.79
>>328
nonlocal(酷い名前だ)を追加したPython3ではネストスコープの問題は無いの?
334:デフォルトの名無しさん
12/08/16 22:09:07.30
じゃあ前もって言うけど、今後二度とクソレスすんな
335:デフォルトの名無しさん
12/08/16 22:10:44.41
>>332
>> (2)関数を定義したら冗長になってしまうほど短い
>>211のコードは>>197のHaskellや>>306のSMLより簡潔だけど?
ああ関数型言語は冗長なのか
336:デフォルトの名無しさん
12/08/16 22:11:12.57
皆が153みたいに粘着してないんだから、後から文句言うなとか文句言ってる時点で頭おかしい
間違いは素直に認めろよ
337:デフォルトの名無しさん
12/08/16 22:13:45.93
間違いを認めるなんて無理だろうから
目の前のPCを破壊して二度と書き込まないでほしい
338:デフォルトの名無しさん
12/08/16 22:15:45.76
>>330
RubyとPerlは?
というかPerlが完全に空気化してるのは、負けたからか?
まだそこそこ使われてるイメージだけどなあ
339:153
12/08/16 22:16:29.83
>>314
>関数型言語でなければならないという観点は間違ってる気がする
ああ、これについては同感だね
現状のどの関数型言語も文字列、パターン、ハッシュの操作に難があるから、
現行LLであるPerl/Python/Rubyを置き換えるには無理があると思う
ただし、関数型言語にも良い特性がある訳で、実際に(LLを含む)多くの言語に影響を与えている
だから自分は「LLにおける関数型プログラミング」に注目している
340:デフォルトの名無しさん
12/08/16 22:18:23.40
>>331
意味わかんねー。問題があったからnonlocalが追加されたんだろ。
しかもnonlocalが有るんなら、代入のある無しでスコープが変わる糞仕様は要らないだろ。
互換性のために残っちゃってるけど。
代入が無ければネストスコープ。
代入が有ればローカルスコープ。
しかしnonlocalが有れば代入があってもネストスコープ。
はぁ、糞ややこしいな。
代入の有る無しと、nonlocalの有る無しの、
二箇所を確認しないといけないなんて。
直感的でも無いしな。
しかし、代入の有る無しでスコープ切り替わるってのは意味分からないよな。
代入は「代入」だろ。代入に別の意味持たせるなよ。
341:デフォルトの名無しさん
12/08/16 22:18:38.00
>>339
LLにおける関数型プログラミング
スレリンク(tech板)
お前一人が明らかに邪魔なので、こちらでどうぞ
342:デフォルトの名無しさん
12/08/16 22:21:13.16
>>340
いや互換性はもはやないよ。あと、代入するならnonlocalだよ
343:デフォルトの名無しさん
12/08/16 22:24:19.36
>>332
再利用しないものに名前を付けるのが冗長だというなら
>>197にあるh,b,fという一次変数も冗長で不要
344:デフォルトの名無しさん
12/08/16 22:24:22.12
>>333
ああ、問題残ってるよ。代入の有る無しでスコープが切り替わる問題が。
互換性のためか残っちゃってるけど、
nonlocal追加したんなら、思い切ってこの糞仕様は廃止すべきだったな。
nonlocal有りならネストスコープ、無しならローカルスコープ。
一貫してそれでよかったんだよ。シンプル、単純、分かりやすい。
スコープ調べるのに代入の有る無し調べるとか意味わかんねー。
折角nonlocal追加したのに、なぜに。
二箇所調べなきゃならなくなったから、状況はより悪化したともいえる。
345:デフォルトの名無しさん
12/08/16 22:25:04.92
>>340
shadowingの概念知らんの?
346:デフォルトの名無しさん
12/08/16 22:26:16.84
>>344
ちょっと待てよ。nonlocal追加以前はそもそも代入不可だろ
347:デフォルトの名無しさん
12/08/16 22:27:08.83
代入と宣言の区別もつかんアホがスコープ批判か...
348:uy
12/08/16 22:27:35.56
perlは終了
jsは用途が違う
PHPはいわずもがな
pythonは日本じゃ流行らない
rubyですね
349:デフォルトの名無しさん
12/08/16 22:30:33.87
>>346
いや、代入できるよ。ローカルスコープの変数になるけどな。
代入があっても、nonlocalならネストスコープ。
nonlocal無くても、代入が無ければネストスコープ。
あー超ややこしいね。
単に、nonlocal有り/無しで、ネスト/ローカルが切り替わる
方が直感的で良いよなぁ。
350:デフォルトの名無しさん
12/08/16 22:31:24.90
>>349
いや、nonlocalを何のために使うのか理解してないでしょw
351:デフォルトの名無しさん
12/08/16 22:34:27.06
>>349
その側の変数には代入できない。それを可能にするのがnonlocal
352:153
12/08/16 22:34:31.89
>>335
え、単純なステップ数で比較しているの!
こちらとしては「再利用されない(一度しか使われない)コード断片を
わざわざ関数として定義するのは無駄(=冗長)」と言ってるだけだけど、これは非常識なのかな?
というかPythonの無名関数(=ラムダ式)は、いったいぜんたい何の為に存在してるんだろう?
ああPythonのラムダはやっぱり「まがい物」なのか
353:デフォルトの名無しさん
12/08/16 22:35:25.54
>>351訂正:その側→外側
globalに似てて、globalとも違うから、いいネーミングだと思うけどなあ
354:デフォルトの名無しさん
12/08/16 22:37:12.96
>>350
その変数がネストスコープであることを示すためだ。
しかし、nonlocalが無くても、参照のみならネストスコープだ。
ここがまずおかしいね。普通、ローカル変数となるべきところだ。
そして、(代入無しで参照しているから)プログラムはエラーで落ちなければならない。
普通そういう動作が求められるところ。
355:デフォルトの名無しさん
12/08/16 22:40:05.99
そんな基地外スコープの言語がつかわれてる理由ってなに
356:デフォルトの名無しさん
12/08/16 22:42:12.88
>>351
なぜnonlocal無しで代入は出来ないのに参照は出来るんだ?
そこがまずおかしいと思わないと。しかも完全なリードオンリーならまだ使い道もあるが、
実際にはメンバ変数を変更したりは自由なんだからCのconstの代わりとしても役に立たない。
別に狙ったものでもなんでもなくて、代入で宣言を代用したことによる単なる文法上の不備でしかないからな。
しかし代入の有る無しでスコープの変わるカス仕様を擁護できるとはおめでたい。
そういう頭じゃないとPythonに惚れ込むのは無理なのか。
357:uy
12/08/16 22:44:18.14
なんかpython使いたくなってきた
スコープは基地外なほうが便利なこともあるんじゃない
358:デフォルトの名無しさん
12/08/16 22:44:18.55
2.xは外側の変数を書き換えられなかったけど、3.xは明示すれば書き換えられるようになっただけじゃね
なにを混乱するんだろう
359:デフォルトの名無しさん
12/08/16 22:45:56.65
>>356
局所変数を定義したら外側のスコープの
同名の変数は直接見えなくなる
Cで書けばこういうことね
int x = 0, y = 0;
{
int x = 1;
printf("%d,%d\n", x, y);
}
printf("%d,%d\n", x, y);
こんな簡単なことも分からない馬鹿って生きてる意味あるの?
360:デフォルトの名無しさん
12/08/16 22:47:51.21
>>352
Pythonのラムダ式は要らんね
ただ再利用されなくても関数として定義するのは言語問わず無駄ではないよ…マシンには無駄かも知れないが
コードを読む際には処理の区切りや、その処理の区切りにとって必要なデータは何なのか、などが明確になる
361:uy
12/08/16 22:48:23.51
>>359
それはCのゴミカスコープ
362:デフォルトの名無しさん
12/08/16 22:51:18.10
>>359
だからそれがカス仕様だって言ってるんだ。
>局所変数を定義したら外側のスコープの同名の変数は直接見えなくなる
それはごもっとも。しかしだ、問題はそこじゃない。
変数の宣言に代入を代用しているから、代入しようとすると宣言する羽目になって、
お前の言う、「局所変数を定義したら外側のスコープの同名の変数は直接見えなくなる」
に陥ってるんだ。だから変数の宣言と代入が別の構文なら、こういう問題は発生しない。
宣言せずに、代入だけすれば、その側のスコープの変数に代入できるからな。
そこがまずミスってるわけ。そんで今になってnonlocal追加。余計にカオス。
他の言語で見られるようなvar方式の方がましだったってわけ。
363:153
12/08/16 22:52:20.86
>>341
お、わざわざスレを立ててくれたんだね、ありがとう
早速、Python関連サイトへのリンク集をカキコしておいたよ
では、このスレでは議題が「Pythonにおけるnonlocalの是非」へと移ったからみたいだから、
(このスレでは)しばらくROMにまわることにする
364:デフォルトの名無しさん
12/08/16 22:53:35.57
いや、そんなに混乱することコレ?w
なんか本当に混乱して全く理解できない状態で説明してるんだよね
365:デフォルトの名無しさん
12/08/16 22:54:19.53
>>363
お前の引き出しの少なさに唖然とするわ
というかお前Pythonのこと何も知らんくせにPythonのリンク貼るなカス
366:デフォルトの名無しさん
12/08/16 22:55:12.21
var: 局所変数を宣言するときに付ける
nonlocal: 外側のスコープの変数へ代入するときに付ける
局所変数の宣言の方が沢山書くんだからvarの方が冗長
ていうかnonlocalが無ければ外側の変数に代入できないんだから
混乱するのはアホだけだ
367:デフォルトの名無しさん
12/08/16 22:55:34.09
>>363
良かったね^^
これで思う存分お前のやりたい議論が出来るね^^