【PHP,Python】スクリプト,バトルロワイヤル36【Perl,Ruby】

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
構文エラーに悩まされてる程度だから
一行書いて、実行(正確には構文ミスしてないか調べる)が
必要なんだろうね。

>>998
試行錯誤開発ならスクリプト言語じゃなくても出来るだろ。

どうせお前の言ってる試行錯誤って設計レベルではなく
コードを一行一行実行しなくちゃならない
正しく構文かけたかな?の試行錯誤だろw

そんな行単位で試行錯誤することなんてねーよ。
試行錯誤するときはクラスレベルだろ。
2デフォルトの名無しさん:2013/07/21(日) 10:53:07.19
REPLは初めて使うような関数の動作を見るとか、
簡易なサンプルを書くときに使うもんだろ。

あんなので開発や試行錯誤するやつなんていねーよ。

どんだけプログラミング=関数の動きを見るだけのやつなんだ?w
自分で関数書けよ。
3デフォルトの名無しさん:2013/07/21(日) 10:57:34.45
途中で止まって再開ができるのは構文エラーぐらいだしな。
構文エラーで悩まされる確率が高い時点で初心者だろうな。

間違って10かける所を100かけてしまったら、
100で割って再開でもするのか?

データベースを間違って更新してしまったら、
修正して再開すんのか?

バグってのは普通こういうものだ。
途中で止まって再開なんて出来やしない。

REPLでそんな非効率な開発なんかしてねーで
テストコード書いて綺麗な状態から
何度でも実行できるようにしろよ。
4デフォルトの名無しさん:2013/07/21(日) 11:00:17.55
構文エラーで悩まされてるに違いない!という妄想に囚われてる奴に何を言っても無駄
静的言語ではこうやるし、スクリプト言語だとしても他のやり方はありえない
という決め付け、思考停止、REPLの存在否定、IDE至上主義
初めから議論する気はないんだ
5デフォルトの名無しさん:2013/07/21(日) 11:01:41.50
スクリプト言語スレに定期的に現れるスクリプトの存在自体のdis
あんたが大将。スクリプト言語は糞だ。だから出ていってくれないかな
なんだこのスレは?この>>1は?キチガイ荒らしは常に頭が逝ってる
6デフォルトの名無しさん:2013/07/21(日) 11:02:18.99
LLスレ時代から何度キチガイ荒らしにスレを潰されただろう。乱立されただろう
プログラミングのプの字も知らないカスに
7デフォルトの名無しさん:2013/07/21(日) 11:08:06.02
>>1
てめぇふざけんなよ
スレ建てたことないのかよ?
8デフォルトの名無しさん:2013/07/21(日) 11:13:43.05
>>1の時点で仕事を果たさない。感情的になって自分こそが正しいと発狂してるだけ
他人から見たら何を言ってるのか一切理解不能
削除依頼出してこいよ。ま、いつもの乱立連投キチガイ荒しのように立てっぱなしだろうがな
9デフォルトの名無しさん:2013/07/21(日) 11:21:47.24
>>4
じゃあ、使ってる言語とREPL。
そして複数のファイルにわかれて複数の関数とクラスを
使ってるレベルのプログラムをREPLで効率的に
開発できる例を見せてくれよ。

間違ってコードを実行した時、どうリカバリーすんの?

それがないと説得力がないだろ。
10デフォルトの名無しさん:2013/07/21(日) 11:22:49.51
>>9
じゃあ、じゃなくて削除依頼出しこいよキチガイ
11デフォルトの名無しさん:2013/07/21(日) 11:28:35.77
いや成果物はファイルなのだからエディタにソースコードはあるし
その関数をコンパイルなしに試せる、試し続けられることがメリットだろ
REPLの使い方おかしくね。なにが「どうリカバリすんの?」だよ馬鹿すぎる
削除依頼出してこいクズ
12デフォルトの名無しさん:2013/07/21(日) 11:50:06.33
>>11
REPLで試行錯誤して開発するらしいよ。

使い方間違ってるよね。

REPLは単に実験するための道具なのに。


単純にテキストエディタのほうがREPLよりも高機能。
それだけで、そんな作成して実行して途中で止まったとこで
また書いて、続きを実行とかいう、
超非効率なやり方をするやつはいない。
13デフォルトの名無しさん:2013/07/21(日) 11:51:47.25
夏休み終了まで、あとたったの40日だから我慢しろお前ら
14デフォルトの名無しさん:2013/07/21(日) 11:51:56.94
>>12
その実験環境があるからこそ、試行錯誤的な開発が容易になるんだろ
なんで片一方しか使わない前提で「リカバリどうすんの?」とか言ってんの?池沼か?
削除依頼出してこいクズ
15デフォルトの名無しさん:2013/07/21(日) 11:55:21.48
>>14
試行錯誤的な開発は、
REPLでやるものではないという話し。

実験っていい方が悪かったか?
単に知らない関数の動きを調べるだけだよ。

マニュアル読むのと変わらん。
そんなのは試行錯誤じゃない。

試行錯誤というのは自分の書いたコード、および設計を試行錯誤するもんだ。
関数の使い方を試行錯誤するとかどんだけレベルが低いんだよw
16デフォルトの名無しさん:2013/07/21(日) 11:56:49.76
お前の言葉の定義とか誰も知らない
試行錯誤することを試行錯誤と呼ぶし、それはREPLで効率的に出来る
削除依頼出してこいよクズ
17デフォルトの名無しさん:2013/07/21(日) 11:58:11.50
>>14
> 前提で「リカバリどうすんの?」とか言ってんの

しょうがないだろ。

だって、書いて実行して、エラーで止まって
続きを書いて、実行を再開するのが、
テストコードを最初から再実行するよりも
効率いいと言ってるバカが居るんだから。

エラーで止まって再開できるのは、構文エラーのみ。
論理エラー、つまり実行したら想定したら違う状態になる。
不正な状態から再実行するにはリカバリが必要なんだよ。

どう考えてもテストコード書いて再実行するほうが
効率がいいに決まってるじゃないか。
18デフォルトの名無しさん:2013/07/21(日) 12:00:10.67
>>16
だったらお前の定義の試行錯誤を書くべきだろ。

早くREPLで試行錯誤の例を見せてくれ
もちろん関数の使い方を調べる以外のな。

それがファイルに書いて最初から再実行するよりも
効率がいいかどうか判断してやるから。


REPLは関数の使い方を調べるツール
試行錯誤をするツールではない。
19デフォルトの名無しさん:2013/07/21(日) 12:03:12.18
>>17
それはそういう使い方しか想定してないからだろ
REPLは常に起動して、
しかも自分が編集中の複数のライブラリと自作ファイルを常にすりあわせて実験できる
これが試行錯誤じゃなくて一体なんなのか
削除依頼出してこいクズ

>>18
REPLで関数の使い方を実験して
上手くいったコードを実装に使う
それのどこが試行錯誤的じゃないんだ?
REPLがなければいちいちコンパイルすることだぞ
マニュアルを読むだけじゃできない
削除依頼出してこいクズ
20デフォルトの名無しさん:2013/07/21(日) 12:07:01.25
REPLは試行錯誤じゃないという日本語的にも間違ったオレオレ定義のもとで勝手に糞スレ立てないで欲しいんだよね
さっさと削除依頼出してこいクズ
21デフォルトの名無しさん:2013/07/21(日) 12:18:17.37
いまどきREPLなんて無いのJavaくらいなのに
何で使った事無いレベルで無知なんだろう
あ…(察し)
22デフォルトの名無しさん:2013/07/21(日) 12:20:48.93
静的言語のREPL使ったことないやつキタ━(゚∀゚)━!
REPL向きの言語というものがあるということがなんで理解できないんだろう
あ、察し!
23デフォルトの名無しさん:2013/07/21(日) 12:24:36.52
REPLは往々にして短いコードを実験するから
簡単な処理ならコードを圧縮できる関数型言語は静的言語でもREPLは使える
C#とかC/C++のREPLを常用してる奴なんていないだろうな
24デフォルトの名無しさん:2013/07/21(日) 12:46:30.18
> 早くREPLで試行錯誤の例を見せてくれ
> もちろん関数の使い方を調べる以外のな。

マニュアルで関数の使い方を調べて
呼び出すだけのドカタ仕事しかしてないと、
こういう発想しか出てこないんだな
25デフォルトの名無しさん:2013/07/21(日) 12:54:47.52
関数の使い方はExcelで決まっているもの
関数の中身はコード書く前から一から十までExcel上で決まりきっているもの
これがドカタですよ
26デフォルトの名無しさん:2013/07/21(日) 13:09:56.10
>>1
優秀な1だな
どうすればスレが盛り上がるか心得ているな
27デフォルトの名無しさん:2013/07/21(日) 13:11:22.10
キチガイの振りしてるつもりなんだろうけど、正真正銘、ただのキチガイなんだよね
28デフォルトの名無しさん:2013/07/21(日) 13:42:23.88
>>17
TDD知らないの?
29デフォルトの名無しさん:2013/07/21(日) 13:50:25.39
いやTDDならむしろ>>17の言ってることが正しいと思うが
30デフォルトの名無しさん:2013/07/21(日) 14:02:23.44
実行中に止めてコード書き直すのとTDDがどうつながるのか
31デフォルトの名無しさん:2013/07/21(日) 14:28:04.47
副作用のある関数ばっか作ってる馬鹿には無理
32デフォルトの名無しさん:2013/07/21(日) 14:50:27.10
んなことオブジェクト指向スクリプトのスレで言われても
33デフォルトの名無しさん:2013/07/21(日) 15:52:53.24
>>32
ここってオブジェクト指向のスクリプトのスレだったのか。
まあshやsed、awkの話題をここでするのは違うか。
34デフォルトの名無しさん:2013/07/21(日) 16:04:22.54
>>31
副作用がなんの関係があんの?

構文エラーで止めてコード修正して進むメソッドは、
関数を最初から再開しないってことなんだよ。
35デフォルトの名無しさん:2013/07/21(日) 16:28:31.77
構文エラーで止めるってそもそもなんなん

[].each do |x|

[]...eachd o|x|

とかなってたら、コンパイル(スクリプトの)時にエラー出るから最初の一行目から実行されない
36デフォルトの名無しさん:2013/07/21(日) 16:31:41.39
>>35
驚愕的なのは、スクリプトでコンパイルってなんだよ?
コードのパースは実行に含まれるって言ってる奴がいるってこと。
37デフォルトの名無しさん:2013/07/21(日) 22:17:25.52
>>34
> 副作用がなんの関係があんの?


> 不正な状態から再実行するにはリカバリが必要なんだよ。
馬鹿がリカバリ云々言ってるからさ
38デフォルトの名無しさん:2013/07/21(日) 22:54:46.40
>>37
話わかってないんじゃね?

構文エラーで止まった所で修正して、
続きを実行する開発方法が
効率がいいとか言ってる馬鹿がいるから
そいつに言ってるんだよ。

副作用全く関係ない。
副作用がない関数であったとしても、
構文エラーはともなく、間違ったコードを実行してしまったら
止まった所からリカバリなしに実行はできない。

俺はそんなアホな開発方法なんかやらないで、
テストを再実行しろと言ってる。
関数をはじめから実行しなおせと言ってる。
39デフォルトの名無しさん:2013/07/21(日) 22:57:45.39
いや普通にテストもしますが?
インタープリタでの実験による試行錯誤を使った開発が
いちいちコンパイル実行を繰り返すより楽という至極当然の事実を述べてるだけ
何が最初から最後までテストだよwアホすぎる
削除依頼出してこいクズ
40デフォルトの名無しさん:2013/07/21(日) 22:59:43.38
一気にテストというのは、静的言語ではそうせざるを得ないというだけ
REPLはもうひとつ前の段階として使える

構文エラーで止まったところで修正して云々という妄想は馬鹿すぎて
削除依頼出してこいクズとしか言えないけど
41デフォルトの名無しさん:2013/07/21(日) 23:00:48.56
こんな糞みたいな>>1はこの板でも唯一無二、この馬鹿だけw
どう自己評価してるんだろう。死にたくならないのだろうか
42デフォルトの名無しさん:2013/07/21(日) 23:02:05.93
どうすんのこのクソスレ?
43デフォルトの名無しさん:2013/07/21(日) 23:09:51.06
>>38
まず日本語を喋ってくれ、構文エラーで〜構文エラーはともかく〜(どっちだよ)
テストを再実行しろ〜(は?何が再なんだ?)
自分が勝手に想定してるこっちに全く見えない前提が多すぎて意味不明
削除依頼出してこい
44デフォルトの名無しさん:2013/07/21(日) 23:21:51.48
削除依頼を出せと言ってる人へ。

俺は出しません。
以上
45デフォルトの名無しさん:2013/07/22(月) 00:42:14.12
>>38
まったく支離滅裂で何を言ってるのか意味不明なんだが、
何をリカバリしろって言ってるんだ?
お前自分で何書いてるか意味分かってないだろ。
46デフォルトの名無しさん:2013/07/22(月) 01:01:49.43
>>45
何をリカバリするかわかんないの?

間違ってコードを実行した時、
続きから実行することは出来ないんだよ。
47デフォルトの名無しさん:2013/07/22(月) 01:03:14.44
「間違ってコードを実行」って何w
48デフォルトの名無しさん:2013/07/22(月) 01:03:55.95
>>1
間違った開発をしてる仮想敵を作ってオラオラ俺のやり方が正しいぞ!と言われてもね
まずお前のやり方って何なのかさっぱり分からんし
仮想敵はお前の都合のいいように間違ってくれてるだけのオナニーショーだし
ちゃんと指摘されたことは受け入れろよ
なんで最初に言った妄想を延々と繰り返し続けるんだ?
完全に会話が噛み合ってないわ
削除依頼出してこいクズ
49デフォルトの名無しさん:2013/07/22(月) 01:54:59.44
REPLでの開発が効率的だってさ、
書いてエラーで止まるから
また続きを書けばいいとのこと

そんなことができるのは構文エラーだけ。
実際は論理エラーで間違った計算を実行してしまうのだから
都合のいい場所で止まったりしない。

だからREPLでの開発は非効率なのだ。
50デフォルトの名無しさん:2013/07/22(月) 02:02:06.34
REPLとは全く無関係な問題でREPLを叩いてて頭大丈夫かと本気で心配になる
さっさと削除依頼出してこい池沼
51デフォルトの名無しさん:2013/07/22(月) 06:42:23.86
都合のいいところで止まるも何も、評価するたびに表示して止まるんだが
REPL使った事無い上に、REPLが何の略かすら分かってないのか
52デフォルトの名無しさん:2013/07/22(月) 07:42:07.30
Ruby Enter Prise Language(松江)
53デフォルトの名無しさん:2013/07/22(月) 08:32:11.21
REPLで開発してる奴なんていないだろ
54デフォルトの名無しさん:2013/07/22(月) 09:12:14.03
ム板にIDはいらないかもしれないけど
末尾!つけてもらったほうがよくね?

もしかして…とか疑ってしまう
55デフォルトの名無しさん:2013/07/22(月) 12:08:51.80
末尾! は既に付いている
そこから分かることは海外産は皆無に等しいという事実
56デフォルトの名無しさん:2013/07/22(月) 12:55:37.93
Perlは最早Pythonの劣化
57デフォルトの名無しさん:2013/07/22(月) 21:40:46.18
Windowsも標準で、もうちょいスクリプト言語いれてくれないかな?
初っぱなから、ある程度使えるlinux、mac とでのマルチプラットホームなやつ
その方向には向かってなさそうだけどね。
58デフォルトの名無しさん:2013/07/22(月) 21:57:47.53
Windowsはプログラミングしない人のためのOSだから
59デフォルトの名無しさん:2013/07/22(月) 22:15:11.86
>>57
Linuxはともかく、MacにプリインストールされてるPythonは
OSバージョンによってバージョンが全然違うから共通プラットフォームとしては当てにならないし
結局自分で好きなバージョンをインストールしたらしたで元のと競合したりしてトラブルの元で開発者にはウザがられてるだろ
60デフォルトの名無しさん:2013/07/22(月) 22:19:10.72
pyenvじゃ駄目なのか?
61デフォルトの名無しさん:2013/07/22(月) 22:22:15.29
>>57
今時、クライアントはLinuxもMacもその方向には向かってないだろ
マルチプラットフォームはブラウザでやれという流れ
62デフォルトの名無しさん:2013/07/22(月) 22:34:00.09
ブラウザも種類とバージョンが色々あってウゼーけどな
63デフォルトの名無しさん:2013/07/22(月) 22:37:11.96
>>61
なに言ってるの?
Macは開発マシンとして有望だし。
64デフォルトの名無しさん:2013/07/22(月) 23:16:52.93
Macなら開発マシンといってもWebかスマホだけどな
どっちにしろ開発者しか使わないので、別途インストールで構わない
65デフォルトの名無しさん:2013/07/22(月) 23:54:33.15
Macって標準のRubyが1.86とかだから、本気で開発するなら自分でインストールしないといけないけどなw
66デフォルトの名無しさん:2013/07/23(火) 00:14:15.62
Macports vs Homebrew vs Fink
の地味な戦い
67デフォルトの名無しさん:2013/07/23(火) 00:18:52.58
>>65
Linuxもそうですが。
68デフォルトの名無しさん:2013/07/23(火) 06:04:41.40
古っ
69デフォルトの名無しさん:2013/07/23(火) 08:33:08.95
コマンドライン一発でインストールできるのに
それすら大変というWindows厨
70デフォルトの名無しさん:2013/07/23(火) 11:42:52.00
WindowsはインストーラでインストールするかZIPを展開してパス等を設定するかなどが必要。
32bit/64bit版の選択が必要で、ものによってはVCでビルドしたものとmingwでビルドしたものとかが
存在してわかりづらい。
71デフォルトの名無しさん:2013/07/23(火) 11:48:21.67
まあ素人は単独でPHPなんかインストールはしないだろうが、PHPのWindowsバイナリはこんな具合。
http://windows.php.net/download/
いろいろ注意書きを読む必要あり。
yum install phpでインストールできるLinuxとは大違い。
72デフォルトの名無しさん:2013/07/23(火) 13:07:37.91
>>57
そこはマルチは無しで、HSPでも入れときゃ良いと思うが
スクリプト言語きっかけにして他のOSに興味でも持たれたらイカンから、windows命のHSPが良い
73デフォルトの名無しさん:2013/07/23(火) 13:24:50.85
いまどきドザ厨とか全く面白くないから
74デフォルトの名無しさん:2013/07/23(火) 13:34:04.22
WindowsさんにはPowerShellがあるじゃないですか
ShellとPerlとTclを煮つめた感じの…
75デフォルトの名無しさん:2013/07/23(火) 17:32:48.30
Rubyの公式サイトは英語版の方がシンプル
WindowsならRubyInstallerをインストールするのがいいでしょう
としか書いてない
VC版とかCygwin版とか、余計なこと書いてないので迷わない
76デフォルトの名無しさん:2013/07/23(火) 21:16:19.88
57だが

なんか、c#で、いい気がしてしまった。
でも、monoで作ったexe、linuxでもダブルクリック起動が、標準でできないんだよね〜。
愚痴った挙げ句、スレチな事書いてごめん。
でも、最近、python勉強中です。
77デフォルトの名無しさん:2013/07/23(火) 21:30:39.81
Pythonで作ったところでOSに元々入ってるPythonは当てにならんし
GUIアプリとかだとどうせ色々必要なライブラリを追加しなきゃいけないから
結局のところLinuxやMacでもPythonランタイム丸ごとアプリに同梱することになるんだよね
78デフォルトの名無しさん:2013/07/23(火) 22:15:31.05
ならねーよ馬鹿
pypiくらい調べてきてから書け
79デフォルトの名無しさん:2013/07/23(火) 22:20:23.42
(赤面)
80デフォルトの名無しさん:2013/07/23(火) 22:27:54.42
DropboxとかPython同梱してるよ
Blenderとかもそうだね
Pythonがアプリへの組み込みに適してるのは大きな売りの一つなのに
何を必死に否定する必要があるのか
クライアントに配るなら組み込んだほうが確実だろ
81デフォルトの名無しさん:2013/07/23(火) 22:36:58.21
ポータビリティのためにPythonで作って
実行にシステムのPython使ったら台無しだ
82デフォルトの名無しさん:2013/07/23(火) 22:38:52.04
それはPythonで作ったからじゃなくて
アプリがPythonを使うからだろw
83デフォルトの名無しさん:2013/07/23(火) 22:44:44.85
私がPythonを使うのではありません
Pythonが私を使わせるのです
84デフォルトの名無しさん:2013/07/23(火) 23:08:25.92
>>81
プラットフォーム依存部分は言語処理系が差異を吸収するのだから、
コード(スクリプト)のポータビリティは保証されるだろ

エンドユーザ向けアプリに処理系を同梱することの一体何が問題なんだ?
85デフォルトの名無しさん:2013/07/23(火) 23:16:10.03
>>82
DropboxはPython製
86デフォルトの名無しさん:2013/07/23(火) 23:21:56.15
>>84
同梱したほうがいいという意味で言ったつもりだった
87デフォルトの名無しさん:2013/07/23(火) 23:36:03.52
しばらくして彼女から一枚の小包が送られてきた。

そこにはカタロニア語で書かれた一枚の手紙と、分厚いカタロニア語の辞書が入っていた。
88デフォルトの名無しさん:2013/07/23(火) 23:57:12.88
まあ、Dropboxに同梱されたPython処理系のサイズって高々数10kb程度だし、
同梱しても問題無いサイズではある
8984:2013/07/24(水) 00:27:11.49
>>86
読み直したらその通りで、自分の早とちりだった
ゴメン
90デフォルトの名無しさん:2013/07/24(水) 00:53:19.67
>>88
もう、処理系は全部アプリに内蔵すればいいんだよ。

Linuxとか。

システム標準の処理系に依存して動くとか動かないとか
アホらしい。
91デフォルトの名無しさん:2013/07/24(水) 01:22:58.26
パッケージ管理システムで管理された
大量のPython製ソフト(当然、処理系は同梱されない)があるのに、
ほんの極一部の例だけで結論を出されてもなぁ……
92デフォルトの名無しさん:2013/07/24(水) 02:33:32.62
処理系同梱厨にコード書かせたら
同じ処理でも関数でまとめずに
コピペしまくるんだろうなぁ
93デフォルトの名無しさん:2013/07/24(水) 06:49:12.20
一般ユーザーにPyPiとか本気で言ってるの?
だいたいそんなもの使いこなせるユーザーが対象なら元から入ってるPythonなんてそれこそどーでもいいだろ
94デフォルトの名無しさん:2013/07/24(水) 07:22:58.24
一般ユーザを馬鹿にしすぎ
皆お前みたいなアホじゃないんだよコピペ厨
95デフォルトの名無しさん:2013/07/24(水) 07:38:16.95
一般ユーザーに夢見すぎ
奴らは黒背景にプロンプトの画面見たら恐怖を感じるのに
9657:2013/07/24(水) 07:56:04.97
それ以前に、英語がちょっとでも出てきたらアウトな人が多い。
97デフォルトの名無しさん:2013/07/24(水) 08:02:26.51
だったらMind使えばいいじゃない
98デフォルトの名無しさん:2013/07/26(金) 19:42:45.36
てst
99デフォルトの名無しさん:2013/07/27(土) 14:39:42.11
Javaと連携できるイケてるスクリプト言語が欲しい
100デフォルトの名無しさん:2013/07/27(土) 14:40:38.13
groovy
101デフォルトの名無しさん:2013/07/27(土) 14:45:09.02
JavaはAPIがイケてないからなあ
正直、Java系スクリプトやScalaで簡潔に書けてるように感じるのは八割くらい
例外処理が強制されないからだと思う
102デフォルトの名無しさん:2013/07/27(土) 16:23:00.14
groovyはイケてるの?
103デフォルトの名無しさん:2013/08/02(金) 20:08:40.60 ID:quhddWZK!
>>22
何それhaskell,ch, cint, pike?
104デフォルトの名無しさん:2013/08/03(土) 10:48:31.31
あんまし書き込みなくなってきたね。
動的言語が終わったのか
プログラミング言語自体が安定期に入ったのか
2chから人いなくなったのか
105デフォルトの名無しさん:2013/08/03(土) 11:37:25.13
> 動的言語が終わったのか
ここはスクリプト言語についての話であり、動的静的は関係ないからだろう
動的なコンパイル言語もあれば静的なスクリプト言語もあるし
106デフォルトの名無しさん:2013/08/03(土) 16:58:50.25
ふつうに4行目だと思う
一部言語のスレに他言語の原理主義者を装った荒らしが棲みついたせいで
どの言語のユーザも不幸になってる気がする
107デフォルトの名無しさん:2013/08/03(土) 19:37:12.22 ID:QuQbJ8u+!
皆が時間の無駄だと悟って英文のmanual読んでるよ
それよか、RだよR。不毛な言語論争よか統計、機械学習の方が金になるって皆が悟ったんだよ。
108デフォルトの名無しさん:2013/08/03(土) 19:42:36.77 ID:QuQbJ8u+!
本当に必要だったものはfunctional PHPのようなモノだったんだ。きっと.
馬鹿馬鹿しい。本当に馬鹿馬鹿しい。皆、ocaml,erlangあたりに行ったんじゃないの?
今さらベンチャーがPython、Railsってだけでも何か負け犬臭しかしないじゃんね
109デフォルトの名無しさん:2013/08/04(日) 23:37:29.36
日本語がお上手ですね
110デフォルトの名無しさん:2013/08/05(月) 00:38:49.55
ゼア イズ オンリー 負け犬 スメル
111デフォルトの名無しさん:2013/08/05(月) 05:20:24.58
負け犬 イズ ルーザー オア アンダードッグ
112デフォルトの名無しさん:2013/08/07(水) 19:50:27.58
RubyとJavascriptを仕事で書いていて「ここが美しくないなー」とかブツブツ不満言っていたけど
先日PHPのソースコード見たら、すげー汚いと感じた。

$var->member

特にこれ。
Cの負の財産だから仕方ないけど。
113デフォルトの名無しさん:2013/08/07(水) 20:01:04.20
どこが汚いのか不明
114デフォルトの名無しさん:2013/08/07(水) 20:23:28.00
C言語はポインタと、そのデリファレンスをプログラマに明示的に扱わせるから、
単なるメンバ参照の "." と、それとは別に -> なんてのがあるわけだけど、
近代的な言語なら "." だけで良い(Javaとか)。

そういった所を深い考えもなしに -> とか書いてかっこいいとか思っちゃうのが
PHP の感覚なんだと思う。
115デフォルトの名無しさん:2013/08/07(水) 20:42:39.54 ID:AaxmOBE0!
mooseにinspireされたelkの解説を聞いてきたけど、何のメリットあるんだろう?
ライブコーディングでVimの補完なしにpythonのコードをガリガリとTypeErrorだとか
newbieの記憶には残らないものをガリガリと書いていたけど、あれなら適当な軽量IDEでも使った方がマシで、
わざわざ瑣末なことを記憶するだけの才能があるならperlで書いた方が速いだろとか思ったけれど思っても口にはしない。
そしてまぁ、本業なら何の迷いもなくJavaとPHPで良いね
116デフォルトの名無しさん:2013/08/07(水) 21:00:30.20
>>114
ひょっとして、-> がシンタックスシュガーって知らないとか?

いやいや、まさかそんなアホがいるわけないか...
117デフォルトの名無しさん:2013/08/07(水) 21:34:08.27
シンタクティックシュガーな。
(*ptr).hoge って書けばいい、って話だろ、カッコが要るだけで。

そもそも*が後置なら(乗算と区別できないから ^ とか別の記号にする必要があるけど)
ptr^.hoge で良かった、ということになるんだけどな。
118デフォルトの名無しさん:2013/08/07(水) 21:46:56.02 ID:AaxmOBE0!
syntactic sugar (シンタクティックシュガー、syntax sugar (シンタックスシュガー )とも)の訳語で、
119デフォルトの名無しさん:2013/08/08(木) 10:12:25.43
というより文字列結合なんかに.を割り当ててるせいじゃないの?
120デフォルトの名無しさん:2013/08/09(金) 08:02:13.57
わりとどうでもいい
121デフォルトの名無しさん:2013/08/09(金) 08:15:42.53
>>117
> そもそも*が後置なら

ひょっとして、* が単項演算子と言うことを知らないとか?

いやいや、まさかそんなアホがいるわけないか...
122デフォルトの名無しさん:2013/08/09(金) 08:31:57.71
123デフォルトの名無しさん:2013/08/09(金) 08:35:58.22
ポインタが後置ならって有名な話じゃん
エキスパートCプログラミングで出てくる話だっけ
124デフォルトの名無しさん:2013/08/09(金) 08:55:27.24
>>121
* は単項演算子であるという知識があるから
前置/後置という>>117の発想ができるわけで、
知らなかった、あるいはつい最近知ったばかりだったのが
>>121であると読めてしかたがない....

2項演算子の前置/中置/後置を指しているとも思えないし....

もしかして自虐的なギャグだったのか?
高度すぎてついていけない
125デフォルトの名無しさん:2013/08/09(金) 09:14:11.98
レベルの違い過ぎる相手に噛みついて、壮絶に自爆って感じだなw
126デフォルトの名無しさん:2013/08/09(金) 10:03:34.32
>>121 は後置単項演算子を知らないのか?
とすると ++ や -- が演算子だということがわかってない?
++ や -- を前置だけで使っていた?
127デフォルトの名無しさん:2013/08/09(金) 10:51:53.26
++や--を持ち出すまでもなく、
「 . 」や「[]」が後置の単項演算子だしな。
128デフォルトの名無しさん:2013/08/09(金) 17:27:34.52
別に.でも->でもどっちでもいいよね
array()みたいに7文字もあると[]の方がいいなと思うけどね
129デフォルトの名無しさん:2013/08/09(金) 19:04:52.67
if文でどこからどこまでがが条件式で、どこからが真のときに評価されるブロックなのかを示すキーワード({とか:とかthen)を
わざわざ書かなくていい言語はメジャーな中ではRubyしかない。
130デフォルトの名無しさん:2013/08/09(金) 19:52:18.29
へぇ
 それはすごいね
end
131.py:2013/08/09(金) 21:08:37.96
へぇ
それはすごいね
132.py:2013/08/09(金) 21:12:41.61
半角スペース消えた…
133デフォルトの名無しさん:2013/08/09(金) 22:27:31.22
>>126
ああ ++ と -- は忘れてたわ。
まあ、オペランド変更するやつまで演算子と言うのはどうかと思わないでもないが。

>>125
> レベルの違い過ぎる相手に噛みついて、壮絶に自爆って感じだなw

それ、「[]」が後置の単項演算子だしな とか、言ってる奴に言ってやった方がいいぞ

単項演算子すら知らないみたいだしね (w
134デフォルトの名無しさん:2013/08/09(金) 22:34:46.63
>>121が自爆だとしても、>>117も同レベルのアホ

そもそも論を語りたいなら、(演算子の前置/後置を持ち出すのではなく)
優先度で話を止めておくべきだった

例:そもそも演算子の優先度について . よりも * が高ければ(....略....)
  ^ptr.hoge で良かった、ということになるんだけどな。

ポインタ参照に後置の上矢印を使うのは、Pascalの流儀
ポインタ参照/メンバ選択に前置の演算子 ! と # を使うMLを含めて以下にまとめる

C:ptr->hoge または (*ptr).hoge /* -> は構文糖 */
Pascal:ptr^.hoge
ML:#hoge (!ptr) (* ! より # の優先度が高いのでカッコが必要 *)

>>117も(>>121と同じく)C言語の前置/後置を
つい最近知ったばかりだったと思われ
135デフォルトの名無しさん:2013/08/09(金) 23:23:14.08
-> はシンタックスシュガーなのだ!

(だからなんなんだろう?)
136デフォルトの名無しさん:2013/08/09(金) 23:44:10.39
別になんでもないだろ、引きずってるのはお前だけだし
137デフォルトの名無しさん:2013/08/10(土) 01:50:44.47
この手の議論は、わりとどうでもいいという言葉に尽きるなw
クロージャとかクラスとかジェネレーターとかの議論の方がはるかに有意義だったな
138デフォルトの名無しさん:2013/08/10(土) 06:57:14.38
139デフォルトの名無しさん:2013/08/10(土) 12:26:25.36
ruby

おいruby10位wwwwwwwwwwwwwwwwwwww
140デフォルトの名無しさん:2013/08/10(土) 13:01:33.58
>>139
7月と何も変わってないけど。数字も読めないの?
http://news.mynavi.jp/news/2013/07/11/126/index.html
141デフォルトの名無しさん:2013/08/10(土) 13:17:07.78
安定して低いって意味だろw
142デフォルトの名無しさん:2013/08/10(土) 13:21:28.40
C、Java、C++、PHP、JSは悪い意味でこれからものこるだろうし
C#(VB)とPythonは総合的にRubyより上だし
Objective-Cは糞言語だけどiOS人気で残るし
Rubyの位置は別に驚きでもないわ。

Rubyのライバルは、ActionScript、CoffeeScript、TypeScript、Lua
終わったPerlあたりだし、今後も上がることはないけど。

2.0対応もろくに進んでないのに2.1が本当に年末に出たらまた多くのgemがゴミ化すんだろうなー
143デフォルトの名無しさん:2013/08/10(土) 14:04:52.02
>>142
> C、Java、C++、PHP、JSは悪い意味でこれからものこるだろうし
これらが残ることがどう悪い意味なのか説明してくれるか?

C 組み込みなど低レベルな領域では必要不可欠
C++ ゲーム開発、処理系開発などパフォーマンス重視な用途では必要不可欠
Java クロスプラットフォームの大規模アプリケーションを作る場合は必要不可欠

PHP, JSは代替言語があるから消えてなくなって問題ないけど。
144デフォルトの名無しさん:2013/08/10(土) 14:26:31.58
C# Windowsとの親和性が高く業務に強い 最近ではゲーム開発で大流行
Python 極めて汎用性が高い素直な優等生

Webしかない言語は敵が多くて大変だね
145デフォルトの名無しさん:2013/08/10(土) 14:34:09.41
>>143
単純にC、Java、C++、PHP、JSついでにObjective-Cは言語として洗練されてないもしくは古過ぎる。
そんな言語でも分野によって必須だからこれからも残るんだけど、
コーダーとしてはそういう駄目な子で仕事するのはイライラするだけじゃね。
146デフォルトの名無しさん:2013/08/10(土) 14:39:13.08
Cはあれでいいんだよ
低レベルな仕事をこなすという目的に対して極めて洗練されてる
他のは中途半端な失敗作だけど
147デフォルトの名無しさん:2013/08/10(土) 14:52:06.01
> 単純にC、Java、C++、PHP、JSついでにObjective-Cは言語として洗練されてないもしくは古過ぎる。

言語マニアか・・・?

こういう奴に限って、
まともなものを何も作ってないんだよな。
148デフォルトの名無しさん:2013/08/10(土) 14:52:34.24
実用上の明確な目的がある言語は美しい
老害COBOLだって固定長レコードを扱うことに特化した非常によくできた言語だ
コーダーがウンコだけど
149デフォルトの名無しさん:2013/08/10(土) 14:53:17.33
いらいらするのなら自分の力で、
ライブラリとか作ればいいと思うんだがねぇ。

イライラの原因を自分で解決できないうちは
半人前だよ。
150デフォルトの名無しさん:2013/08/10(土) 15:04:20.53
>>147
自爆兄貴オッスオッス!
151デフォルトの名無しさん:2013/08/10(土) 15:06:33.96
まーた意味のないくだらないレスをつけるw
152デフォルトの名無しさん:2013/08/10(土) 15:12:33.97
>>143
>PHP, JSは代替言語があるから消えてなくなって問題ないけど。

JavaScriptは「ブラウザ向けに限れば」標準規格化されて盤石の位置にあると思う
言語仕様で問題があり多くの派生言語は生まれているが、JSそのものは必要不可欠
ただし、サーバサイドおよび汎用言語としては、存在価値を見いだすのは難しい


>144
>Python 極めて汎用性が高い素直な優等生

それにもかかわらず、Webだけは適応に失敗したという矛盾w
それにもかかわらず、ワンライナーが苦手で対話型プログラミングには不適という矛盾w


>>146
Cを置き換えるような言語は、今後も登場しないのではないかと思う


>>148
事務処理向けDSLと見れば、今でもCOBOLは優秀な言語だろね
153デフォルトの名無しさん:2013/08/10(土) 15:47:51.75
サーバーサイドでも今はnode.jsが伸びてきてるが
154デフォルトの名無しさん:2013/08/10(土) 16:03:55.64
PHPはWordpressしか使えないへっぽこWebデザイナーには必要不可欠
155デフォルトの名無しさん:2013/08/10(土) 16:42:55.74
node.jsが伸びてる理由ってなんでなんだろう
jsのシングルスレッド云々とかが何かしら奇跡的にサーバーサイドと相性良かった
まさかな
156デフォルトの名無しさん:2013/08/10(土) 16:51:53.80
言語がエレガントに書けるかどうかなんてどうでもよくて
何が出来るかとか、インフラとして利用価値が高いとかの方が
よっほど意味があると思うんだよな
そう言う意味ならC言語の代替は無いしJavaの代替も無い
JavaScriptの代替も無いし、
PHPと他のライト言語と出来ることの差も無い
言語仕様の些細な差にこだわる奴(自分で言語を設計してるわけでも無いくせに)
ってのは無能にしか見えないね
157デフォルトの名無しさん:2013/08/10(土) 17:07:43.75
全然どうでも良くはない
実際jsにクロージャがなかったら今の栄光はない
158デフォルトの名無しさん:2013/08/10(土) 17:28:34.85
うん、クロージャの存在は言語設計上の判断として大きいね
実際、「極めて汎用性が高い素直な優等生(>>144)」を自称するPyhtonにおいて、
最大の設計ミスの一つが「クロージャの欠落」だと思う
159デフォルトの名無しさん:2013/08/10(土) 17:36:04.53
いや、pythonにクロージャはあるし、pythonが優秀な理由の一つだけど
160デフォルトの名無しさん:2013/08/10(土) 17:45:51.84
>>155
node.js以前のマルチユーザサービスはマルチスレッディングで実装するのが常識だった
それをシングルスレッド上の非同期処理で全面的に実装したnode.jsの登場は、
一つのイノベーション(革新)であり、それが多くのWebデベロッパを引きつけた要因

ただし、node.jsは非同期処理に特化したWebフレームワークであって、
非同期処理とその利点であるスケーラビリティを重視するサービスであれば最適だが、
そうでない多くのサービスでは、node,jsが提供しない機能を自力で実装しなければ
ならないことが大きな負担になる
つまり、多くの用途にはRailsのようなオールインワン型汎用Webフレームワークが
適しているので、node.jsは注目されても普及する(他からシェアを奪う)ことは無い

また非同期処理そのものはJavaScriptでなくても実装できるし、
実際に他の言語でも(node.jsの影響を受けた?)非同期処理向けのライブラリが登場している
非同期処理採用フレームワークの先駆者としてnode.jsの功績は賞賛にふさわしいと思うが、
ただそれだけをもってWebの世界を制覇できるほど甘くはないのが現実
161デフォルトの名無しさん:2013/08/10(土) 17:54:53.31
その大きな負担となる機能とやらはたとえばなに?
nodeはモジュールを組み込んで使うプラットフォームであって、
現在では、たいていの機能はモジュールで提供されているけど?
sinatraライクなフルスタックのフレームワークもあるし
162デフォルトの名無しさん:2013/08/10(土) 17:54:57.20
>>160
Twisted や EventMachine が前からやってた非同期プログラミングと
Node.js のそれとではモデルが違うのん?
163デフォルトの名無しさん:2013/08/10(土) 18:04:48.91
まあPython2のクロージャは使い物にならなかった
nonlocalで手軽に変数に代入できる3はいいけど
164デフォルトの名無しさん:2013/08/10(土) 19:07:51.05
手続き型言語に毒されたウンコには理解出来ないだろうけど、
再代入は本来避けるべきもの
外のスコープの変数なら尚の事
165デフォルトの名無しさん:2013/08/10(土) 19:18:52.84
node.jsはコルーチン、継続、C#5.0のasync/wait等を使って
非同期処理を同期的に記述できるようにしてあるものに比べると微妙に見えるな
まあV8にyield来るらしいからその辺は改善されていくかもしれんが
あと非同期フレームワークの先駆者というのは嘘

>>162
フレームワークの出来栄え的には巨大でコールバック地獄なtwistedはまさにnode.jsだな
Pythonならコルーチン使ってるgevent/eventletみたいな系統のほうが書きやすいよ
asyncみたいな特殊なキーワードすら要らないし標準のソケットライブラリに
モンキーパッチ当てて非同期化できるんで、同期とほぼ全く同じコードを
透過的に非同期に出来る
node.jsより古参のはずだけどな
166デフォルトの名無しさん:2013/08/10(土) 20:09:11.79
> node.jsより古参のはずだけどな
比べるなら言語で比べるべきではないの?
167デフォルトの名無しさん:2013/08/10(土) 20:52:18.37
>>159
ええっ?Perl・Ruby・Javascriptにクロージャってないんだ!!
168デフォルトの名無しさん:2013/08/10(土) 21:25:20.76
そもそもクロージャってそんな頻繁に使うか?

どっかの関数ポインタすらない言語は頻繁に匿名クラスを使うしかないから
クロージャが必要になってくるけど
169デフォルトの名無しさん:2013/08/10(土) 21:29:07.87
非同期処理で大量に使うよ
マルチスレッドじゃない方の非同期な
そんなもん使わないで>>165の言うように言語サポートによって同期っぽく書けるのが理想だけど
170デフォルトの名無しさん:2013/08/10(土) 21:48:19.08
数年前華々しく登場したGoてどうなったの?
早くも消滅した?
171デフォルトの名無しさん:2013/08/10(土) 21:49:37.44
Go、CoffeeScript、JSX当たりは死亡した。
172デフォルトの名無しさん:2013/08/10(土) 21:55:48.61
GoとDartはマジでいらない
MSは言語のセンスあるからごり押しも許せるけどGoogleはどうしようもない
173デフォルトの名無しさん:2013/08/10(土) 21:58:35.00
nodeの最大の欠点はコールバック地獄なんかではなく
javascriptの冗長な記述そのもの
alterjs使うと世界が変わる
174デフォルトの名無しさん:2013/08/10(土) 22:02:56.38
センスは余りいらない。
実用的装備を整えるべき。
それが普及の大前提。
話はそれからだ。
Googleは実験的に初めて放置しやすい。
175デフォルトの名無しさん:2013/08/10(土) 22:07:32.28
>>173
あれしこで冗長ってw
お前、そんなにたタイピング速度遅いの?

俺は冗長な記述よりも
考えるほうが時間が掛かるが?
176デフォルトの名無しさん:2013/08/10(土) 22:12:59.45
CoffeeScriptは死亡してないだろ
そもそもJavaScriptのシンタックスシュガーに過ぎないから学習コストも0で覚えるのは余裕だし
死なれても問題ないけどさ
177デフォルトの名無しさん:2013/08/10(土) 22:17:18.95
CoffeeScriptってあんまりコード量へらないんだよな。
functionとreturnという単語の分は減るけど、
そんなの1関数に1回ぐらいしか使わない定義部分。

中身のコードを減らしたいのに、括弧だけの行が
減るぐらいしか効果がない。
178デフォルトの名無しさん:2013/08/10(土) 22:17:35.23
どう見ても冗長だ
無駄な記述やインデントをしないといけないから
修正も面倒になる
ああもしかして一つの関数に長文書いちゃうタイプか?
179デフォルトの名無しさん:2013/08/10(土) 22:19:13.09
お前の言う無駄な記述やインデントは
全然大したことじゃないって話だよ。
単に打つ文字列の違いでしか無いだろ。

そんな細かい文字数を来にしてないで
本質的なコード量を減らせ
文字数を減らすんじゃない、
処理コードを減らせ。
180デフォルトの名無しさん:2013/08/10(土) 22:22:08.40
http://ja.wikipedia.org/wiki/CoffeeScript

下記は jQuery を使った典型的な JavaScript のコード例である。

$(function() {
 // 初期化のためのコード
});

CoffeeScript では function キーワードが -> で置き換えられている。

$ ->
 # 初期化のためのコード


jQuery などではクロージャを多用するが、CoffeeScript ではクロージャが簡潔に書けるようになっている。
これは /info の内容を取ってきて、#info にそれを入れる場合の jQuery を使ったJavaScript の例である。

$.get("/info", function(txt) { $("#info").text("info = " + txt) }, "text")

CoffeeScript でも以下のように1行で書け、75文字が67文字へと1/10程度文字数が減っている。
$.get("/info", ((txt) -> $("#info").text("info = #{txt}")), "text")
181デフォルトの名無しさん:2013/08/10(土) 22:22:58.49
記述量が減ればコードの見通しが良くなるし
処理を減らす余地も生まれやすいだろ
冗長であることを誇ってどうするんだこの馬鹿は
182デフォルトの名無しさん:2013/08/10(土) 22:24:05.18
}); の嵐は Lisp のカッコ以上に凶悪
183デフォルトの名無しさん:2013/08/10(土) 22:24:19.96
>>164
手続き型というより、オブジェクト指向かもな
内部に状態変数を持っていて、それを更新する
まあそれと対極の関数型の考え方も理解できないではないが、
主流のスタイルじゃないし、現実問題やっぱり再代入をする
スタイルが必要なことが多いんじゃないかな
184デフォルトの名無しさん:2013/08/10(土) 22:25:21.64
>>181
だから記述量と文字量の違いを区別しろよ。

やってる処理の内容が同じ場合、
それは文字量が減っているだけ。

記述量の話をお前はしていない。

CoffeeScriptは文字量を減らすだけ
記述量が減る例はごくわずか。
185デフォルトの名無しさん:2013/08/10(土) 22:27:47.63
> 記述量が減ればコードの見通しが良くなるし

これは間違い。

index を idxと略しても
コードの見通しが良くなるとは限らない。
186デフォルトの名無しさん:2013/08/10(土) 22:28:38.42
>>185
そんなくだらない事言ってないぞ?
冗長の意味履き違えるなよ
187デフォルトの名無しさん:2013/08/10(土) 22:30:40.23
>>186
冗長の意味を履き違えてるのは
CoffeeScriptだろ。

CoffeeScriptは単に文字を減らしているだけ。
そもそもシンタックスシュガーだろ?
文字を減らしただけって証拠だよ。
188デフォルトの名無しさん:2013/08/10(土) 22:33:02.67
function キーワードが -> に置き換えられるっていうのは
まさしく、文字を減らしただけだな。
189デフォルトの名無しさん:2013/08/10(土) 22:35:22.15
>>184
余計な区切りや括弧やキーワードがあることで
全体の処理の流れが直観的に追えなくなる
記述量が減ることで近くのもの同士の関連がより読み解きやすくなる

シンプルな方がいいっていうすごく簡単な理屈なんだけどわからないのかな?
190デフォルトの名無しさん:2013/08/10(土) 22:43:38.51
functionを->にできるのが利点ってならES6普及後はcoffeescriptの利点はなくなることになる。
191デフォルトの名無しさん:2013/08/10(土) 22:43:48.08
なんか冗長という言葉を間違って使っている人が
いるんじゃないかなって気づいたかもしれない。

例えば、
$('input').each(function() {
 $(this).prop('disabled', true);
});

こういうコードがあった時、

$("input").each ->
 $(this).prop "disabled", true

CoffeeScriptならこうかける。JavaScriuptは冗長だ!っていう人を俺は
「冗長」という言葉で指摘するのはそこじゃないだろって思うわけ。
括弧が減るのも何かを省略できるのも一緒。
そんなもん書き方を変えただけ。タイプ数が減ったとしか思わない。

冗長というのは(同じ言語において)無駄なことをやっている場合に
指すべきだと思う。最初のコードで言えば、

$('input').prop('disabled', true);

こう書けばいいわけ。こう書かないことについて、俺は「冗長」と表現する。
192デフォルトの名無しさん:2013/08/10(土) 22:46:12.18
>>189
重要な区切りや括弧やキーワードがないことで
全体の処理の流れが直観的に追えなくなる

セミコロンを省略できたからって
それがいいことだとは思えないんだが。

セミコロンがあれば、そこで終わりとはっきりする。
無いことで終わりなのか続いているのか
”人間が”認識しづらくなる。

そりゃ、機械は認識できるだろうけどさぁ。
俺達は人間なんだぜ?
193デフォルトの名無しさん:2013/08/10(土) 22:47:06.77
>>188
>function キーワードが -> に置き換えられるっていうのは
>まさしく、文字を減らしただけだな。
後者が削ってるのは文字だけじゃないよ
そのまま返すって機能がついてるし
194デフォルトの名無しさん:2013/08/10(土) 22:50:18.44
>>183
オブジェクト指向は指向であって、手続き型言語と関数型言語のどちらにも適用できる概念
より正確には、手続き型言語より命令型計算モデル、関数型言語よりも適用型計算モデルだ
両者の違いは、オブジェクトが可変(mutable)であるか不変(immutable)であるかという点
命令型計算モデルにおけるオブジェクト指向では、
  オブジェクトにメッセージを送ると、オブジェクトの内部状態を書き換える(更新する)
適用型計算モデルおけるオブジェクト指向では、
  オブジェクトにメッセージを送ると、内部状態を更新した新しいオブジェクトを返す

そして、不変オブジェクトを多用する関数型プログラミングは、
「まともなクロージャ」を備えたJavaScriptやRubyであれば一般レベルで普及している
JavaScriptであれば、jQueryがだれでも知っている実例になる
Rubyでは、たとえば以下のような関数型プログラミングのスタイルは特異なものではない
  collection.select { |e| ..... }.map { |e| .... }.sort { |x, y| ....}

もちろん可変オブジェクトの使用がゼロ、つまり純粋関数型プログラミングではないが、
大域的な可変オブジェクトを極力減らし、できる限り(Rubyであれば上記コードのような)
不変オブジェクト間の演算で計算を進める方向性が見える
195デフォルトの名無しさん:2013/08/10(土) 22:52:25.63
>>192
それはその通りだしCのような記述が嫌いなわけではない
ただjavaScriptの用途では匿名関数をその場で作る事が多いのに
処理と関係のない修飾が過剰になって読みにくくなっている
ocamlのlet-inのようなの
196デフォルトの名無しさん:2013/08/10(土) 23:01:33.08
>>191
それは確かに処理そのものが冗長でわかりやすいな

俺が言っているのはコードの表現が冗長という事
その上でindexをidxとするうようなただ文字数を減らすだけの物は
直感を削ってしまうので冗長を削ったものではないと言った

名前付けそのものに関しては主観と言われれば終わりだが
197デフォルトの名無しさん:2013/08/10(土) 23:21:29.60
>>194
よくわからない
例えば、jqueryはdomの状態を変更するよ
オブジェクトを返すけど、新しいオブジェクトを作って返してるわけじゃない
だからその例で行けば関数型じゃない方のスタイルだろ
そして、パフォーマンスなどの理由から、そういう新しいオブジェクトをわざわざ作り直して
返す関数型のスタイルは今の主流のスタイルではない
198デフォルトの名無しさん:2013/08/10(土) 23:25:05.00
一部の動的型付け言語って、IDE使う習慣がないからって
今更冗長な型づけ宣言を導入しようとしているのが笑える。

Object obj = new Object()

とか。
動的型付け言語なのに、自明な型推論すら導入しないってアホすぎる。
199デフォルトの名無しさん:2013/08/10(土) 23:26:58.74
>>197
同意。
オブジェクト指向モデリングで、ステートレス設計もあるので、
一概に関数型言語が、OOPと相容れないとは思わない。
しかし、状態を保持しない設計を強制するのは、
生成・破壊(コピー)コストを考えると、現実的ではない。
200デフォルトの名無しさん:2013/08/10(土) 23:46:42.43
>>197
jQueryに置けるDOM操作は一般的プログラミングにおけるI/Oであり、
I/Oを含む一切の副作用を許さないのが「純粋関数型プログラミング」と呼ばれ、
これを代表する関数型言語にHaskellがある
そして「純粋でなければ関数型にあらず」という絶対原理主義の主張もあって、
それを鵜呑みにする人も多い(多かった?)けど、>>197はその影響を受けていないかい?
ただし、このスタイルは(>>197が言うように)今の主流スタイルではないし、
もし仮に主流になるとしても遠い未来のことだと(個人的には)考えている

その一方で、部分的な再代入やI/Oといった副作用を許容する立場もあり、
LispやMLといった伝統的な関数型言語の主流の考え方にある
>>194で書いた関数型プログラミングというスタイルも、
(I/Oや限定的な可変オブジェクトを許す)後者の立場を取っている

jQueryもDOMという可変オブジェクトと破壊的操作があるけれど(=純粋ではないけど)、
それ以外の部分では関数型プログラミングのスタイルを積極的に導入していると思う
201デフォルトの名無しさん:2013/08/10(土) 23:56:52.14
>>199
>しかし、状態を保持しない設計を強制するのは、
>生成・破壊(コピー)コストを考えると、現実的ではない。

基本的に同意する。
ただし、LispやMLといった伝統的な関数型言語では、
状態を保持しない設計を強制していないし、
Lispでは関数 set-car! 、MLではref型やarray型のように
(メモリやCPUの)効率を考えたコード設計も許容している

>>200で書いたように、状態を保持しない設計を強制するのは、
Haskellのような純粋関数型言語の場合だけだから、
そこは誤解しないでほしいと願う
202デフォルトの名無しさん:2013/08/11(日) 00:02:49.40
で、結局話に戻るが、スコープの外側の変数を変更するのは普通に有用
203デフォルトの名無しさん:2013/08/11(日) 00:08:28.65
スコープの外側の変数を変更はあまりしてほしくない。

だからクロージャではなく
関数内関数が欲しい。
クロージャのように記述できるが
クロージャの中と外は完全に分離されている。
204デフォルトの名無しさん:2013/08/11(日) 00:15:25.53
つまり Pascal サイコーってこと?
205デフォルトの名無しさん:2013/08/11(日) 00:21:02.25
>>203
>スコープの外側の変数を変更はあまりしてほしくない。

ここまでは賛同するけど、その後が間違っているな
 だからクロージャではなくてもいいから、
 無名関数内で局所変数が欲しい。
だろ

あと、後半の
>クロージャのように記述できるが
>クロージャの中と外は完全に分離されている。
は意味不明
関数内関数であっても、外の関数と内の関数が完全に分離されている点では同じじゃね?
206デフォルトの名無しさん:2013/08/11(日) 00:25:34.29
あらいぐまPascal
207デフォルトの名無しさん:2013/08/11(日) 00:47:10.08
要は一定の処理を別にふって、その振り先に引数渡したり戻り値受け取りたいだけだろ。
そんなことは当たり前にできるべきだし
クロージャーみたいな名前で呼ばれてること自体がおかしいんだよ。

C#はクロージャーってわざわざ名前つけてないけど、普通にそういうことができる。
208デフォルトの名無しさん:2013/08/11(日) 00:51:03.84
例えばこういうクラスがあったとする

class A {
 function foo() {
   :
   : 長い処理
   :
 }
}

関数foo()をリファクタリングしたとき、
foo()の中でやっていた処理を
foo()の外にに出すのは
スコープ的にはおかしいと思うんだ。
209デフォルトの名無しさん:2013/08/11(日) 00:56:11.99
class A {
 function foo() {
   var i = 0;
   :
   bar()
   : 長い処理
   bar()
   :
 }
 function bar() {
   :
 }
}

スコープ的にはおかしいけど、リファクタリングでよくこうやるよね。
で、この場合bar()から i は見えないんだ。
つまりコードの独立性が高いよね。
210デフォルトの名無しさん:2013/08/11(日) 00:58:51.48
>>207
>要は一定の処理を別にふって、その振り先に引数渡したり戻り値受け取りたいだけだろ

それは、そもそもクロージャではないだろ
ただ単に関数(メソッド)を第一級市民として(=値として)扱いたいだけなら、
C言語にも関数ポインタがあるから記述できるけど、それをクロージャと呼ぶアホはいない

>>207はクロージャが何かを知らないんじゃねえの?
211デフォルトの名無しさん:2013/08/11(日) 00:59:09.68
でもbar()はクラスAのどこからでも見えるスコープになってしまっている。
bar()はfoo()でしか使わないのだから、こう書いたほうがいいと思うんだ。

class A {
 function foo() {
   var i = 0;
   :
   bar()
   : 長い処理
   bar()
   :

   function bar() {
     :
   }
 }
}

でもこう書いてしまった時に、bar()から i が見えてしまったら
今度はコードの独立性が下がってしまうんだ。

foo()の中にfoo()でしか使わないbar()を定義できるが、
そのbar()からは、iが見えないという関数が必要だ。
212デフォルトの名無しさん:2013/08/11(日) 01:05:49.31
そもそも>>208-209の例はおかしい。

そんな複数のメソッド、それも外部からアクセスさせたくないものがあるなら、
それを別個にクラスとして定義するべきだろ。
213デフォルトの名無しさん:2013/08/11(日) 01:07:09.28
>>208

もしかして全ての手続きをmain()の中に(関数内関数等を使って)記述しろといいたい?
214デフォルトの名無しさん:2013/08/11(日) 01:08:39.17
つまり Pascal サイコー ですね
215デフォルトの名無しさん:2013/08/11(日) 01:09:29.32
>>213
いいえ?

色んな所から呼ばれる関数はmain()の外。
main()からだけしか呼ばれない関数は
main()の中に記述しろと言ってる。

変数と一緒だよ。
色んな所から書き換える変数は
main()の外。

main()の中でしか使わない変数は
main()の中だろう?
216デフォルトの名無しさん:2013/08/11(日) 01:13:24.37
>>210
同じ事だよ。
一般的にクロージャとかわざわざ呼んでる言語がクロージャでしたいことは、処理を投げて
その処理にローカル変数を参照させたいとか戻り値を受け取りたいってだけじゃん。

finalつけないと参照できないみたいな糞言語があるせいか
クロージャーとかわざわざ呼んでいるけど
217デフォルトの名無しさん:2013/08/11(日) 01:15:56.59
>>198
どの言語が静的型付をいれようとしてるの?
218デフォルトの名無しさん:2013/08/11(日) 01:16:49.30
>>216
クロージャーという用語が出来たのは
Javaができるよりも前だよ。
219デフォルトの名無しさん:2013/08/11(日) 01:17:34.28
やっぱり >>215 は Pascal サイコー な人だったのですねw
220デフォルトの名無しさん:2013/08/11(日) 01:19:01.52
class A {
 function foo()
 {
  new class B().do(); 
 }

 class B {

 function do() {
   longMethod();
 {

 function longMethod() {
 }

}



・class Bがclass Aのみに参照できること
・class Bの関数の中のうちlongMethod()は外部から参照できないこと


以上2つができない言語を使っているアナタに一言 : それはオブジェクト指向型言語ではありません。
221デフォルトの名無しさん:2013/08/11(日) 01:22:05.52
>>216
え、では(>>210で述べた)C言語で関数ポインタを使うコード設計のことも
(>>216は)クロージャだと見なすのか.....

せめてWikipediaで「クロージャ」を一読してからカキコしてくれ、タノム!!
222デフォルトの名無しさん:2013/08/11(日) 01:22:09.87
※注意

「何かが出来ない」と「何かが出来るのと出来ない機能の両方を備えている」

は意味が違います。


はい、続きをどうぞ。
223デフォルトの名無しさん:2013/08/11(日) 01:23:36.22
>>220
インデントも括弧の対応も取れてないコードを書かれてもね(苦笑)

おかげで何が言いたいのかさっぱりだ。
224デフォルトの名無しさん:2013/08/11(日) 01:26:41.74
>>223
普段C#で書いてるからな。

>>208に対する>>220の意味が分からん場合は、多分JSみたいな糞言語使っていて
オブジェクト指向型言語つーのが理解できてないんだと思う。
225デフォルトの名無しさん:2013/08/11(日) 01:27:19.62
>>220
Smalltalkは、そのどちらもできないけど、
Smalltalkがオブジェクト指向言語ではないと言う人は初めてだぜ!!

いや、それともオブジェクト指向型言語とあるから、
オブジェクト指向言語(OOP)とは別の異世界にある言語族なのかなw
226デフォルトの名無しさん:2013/08/11(日) 01:29:22.91
C#で書いてるのと、自分がミスしたことと
何が関係あるんだろう?

あ、もしかして自分がミスしてることに気づいてない?
227デフォルトの名無しさん:2013/08/11(日) 01:33:52.39
>>216
クロージャがない言語(たとえばC)では、関数から抜けたら
ローカル変数の寿命は終わりでいいし、だから効率上スタックを使って
実装されることが多い

一方、クロージャの場合、クロージャから参照される外側の関数のローカル変数は
少なくともクロージャの寿命と同じだけは生かさないといけならず
クロージャの寿命は外側の関数からリターンした後も継続するかもしれない
つまりスコープ上はローカルなオブジェクトの寿命(エクステント)が伸びるという
特殊な状況が生じる
こうしたローカル変数を、クロージャにキャプチャされていると呼んだりする
クロージャというのは、このようにキャプチャされた変数と関数の組(オブジェクト)を
指す
228デフォルトの名無しさん:2013/08/11(日) 01:35:19.88
>>225
Pythonですらカプセル化ができないから完全なオブジェクト指向型言語じゃない。
そういう厳密な定義では、Smalltalkは関数は全てpublicだから不完全。

>>226
C#のインデントスタイルはBSDオールマンが標準なんで、K&R式ではないんですが、そんなことも知らないんですね。
229デフォルトの名無しさん:2013/08/11(日) 01:35:23.82
>>224
その意味はオブジェクト指向ではなくて、名前空間ではないのかな?

ちなみにRubyでは名前空間としてmodule宣言が、クラス定義としてclass宣言があるから、
名前空間の分離とクラス定義の分離を意識したコードが書けるし、
たまたまClassクラスはModuleクラスのサブクラスだから、
クラス内クラス(あるクラスの名前空間に閉じたクラス)の定義もできる
ただし、それをオブジェクト指向と呼ぶ人は誰もいない
230デフォルトの名無しさん:2013/08/11(日) 01:41:41.76
>>220
やっぱり気づいていないんだ? { がひとつ足りないことにw
231デフォルトの名無しさん:2013/08/11(日) 01:42:33.02
オブジェクト指向言いたいだけなんだろうなw

俺の知ってるオブジェクト指向が
本物のオブジェクト指向だ。

みたいなこと言ってるし。
232デフォルトの名無しさん:2013/08/11(日) 01:44:28.21
>>228
まず最初に「完全なオブジェクト指向型言語」とやらの厳密な定義を示してくれないと
議論にならないよ

たとえば純粋オブジェクト指向言語は「あらゆるデータがオブジェクト」と定義できるから、
Smalltalkは純粋オブジェクト指向言語であるけれど、C#はそうじゃない

これと同様に「完全」と呼ぶ性質を定義してくれ
233デフォルトの名無しさん:2013/08/11(日) 01:44:29.67
今の主要なオブジェクト指向言語はだいたい、フィールド変数という名の、
スコープ外変数をメソッドから変更しているが、それを全否定か?w
234デフォルトの名無しさん:2013/08/11(日) 01:49:31.41
というか、オブジェクト指向という用語を考えて一番始めに使い始めたのって、
Smalltalkの作者だろw
後からストラウストラップのようなバカどもが間違った定義で話を進めたために、
本来の意味とは違う意味になってるようだがw
235デフォルトの名無しさん:2013/08/11(日) 01:54:35.61
Smalltalkに向かってオブジェクト指向じゃないってのは、
本当にコントみたいな話だなw
236デフォルトの名無しさん:2013/08/11(日) 01:55:19.45
>>232
C#では数値もオブジェクトだぞ
237デフォルトの名無しさん:2013/08/11(日) 01:57:34.06
http://e-words.jp/w/E382AAE38396E382B8E382A7E382AFE38388E68C87E59091E8A880E8AA9E.html
オブジェクト指向という用語は1972年にSmalltalkが発表された際に考案されたが、
そのアイデアが初めて現れたのは1967年のSimula 67であるとされる。
238デフォルトの名無しさん:2013/08/11(日) 02:01:10.04
http://d.hatena.ne.jp/sumim/20040525/p1

一般に「オブジェクト指向プログラミング」と呼ばれる考え方には発案者が異なる二系統がある。

アラン・ケイによる、変化に強い長期運用可能な遅延結合システムを SIMULA67 にあった
「オブジェクト」をメッセージの受け手とすることで実現(オブジェクトにメッセージ送信)
するアイデアに基づく「メッセージングのオブジェクト指向」と、
ビアルネ・ストラウストラップによる、ユーザー定義型(抽象データ型)を SIMULA67 にあった
「クラス」という言語機能を使って実現(カプセル化、継承、多態性)するアイデアに基づく「抽象データ型のオブジェクト指向」。

この二つの「オブジェクト指向」は、オブジェクト指向という呼称、「クラス」や「オブジェクト」と
いった主軸となる言語機能を共通して使用してはいるものの、考え方の方向性が全く異なっており本来きちんと区別すべきものである。

しかし、教科書的な記述の多くはこれら二つを書き手に都合のよい解釈でごちゃまぜにしてしまっており、
しばしば学習者に対して無用な混乱を生じさせている。

オブジェクト指向言語はこれら二系統のどちらかを比較的厚くサポートすることが多いが、
完全にはサポートできてはいない。また、たいていはどちらかに重きをおきつつつ双方を
不完全ながらサポートする言語が多いため、利用者(プログラマー)がまず先に概念を
理解しどちらの考え方でプログラミングをするかを決めないと機能の間違った使い方になってしまう。

同じ理由で、オブジェクト指向という概念を特定の言語の(「オブジェクト指向」むけと思われる)
機能から外挿して学ぶのは難しいし、間違った「オブジェクト指向」を創造してしまう危険がある。
少し遠回りに思えても、それぞれの考案者自らがその主張を綴った論文を読んで理解を試みるほうがいい。
239デフォルトの名無しさん:2013/08/11(日) 02:16:29.70
一番重要なのは、その用語を考案したのは誰で、最初にどういう定義をしたかということ
アイディアが現れたのはいつかというのは、ここでは全く重要ではない
言葉の定義の話なのだから
そして、すでに定義があるのに、あとから別人が別の定義で話をはじめたら
混乱が起こるに決まっている
それをやってしまったバカがストラウストラップ
240デフォルトの名無しさん:2013/08/11(日) 02:16:40.63
>>236
C#でクラスはオブジェクトかな?
Smalltalkは純粋オブジェクト指向言語だからクラスもオブジェクトだけどね
241デフォルトの名無しさん:2013/08/11(日) 02:22:11.13
>>239
たぶん、ストラウストラップ が違う名前をつけていたら、
世の中に普及していたのは、その違う名前のほうで、
オブジェクト指向はメッセージ指向と同じく
マイナーなものになっていただろうな。
242デフォルトの名無しさん:2013/08/11(日) 02:22:30.13
インターフェース指向か型指向だろ
243デフォルトの名無しさん:2013/08/11(日) 02:25:29.28
>>241
仮にそうなったとしても、少なくともその方がはるかに混乱は少なかっただろうな
まあ、そもそも上に出てきた真のオブジェクト指向とやらは、ストラウストラップの
言ってるオブジェクト指向とも違うようだが
244デフォルトの名無しさん:2013/08/11(日) 02:27:23.53
>>241
たられば論だったらお子様にもできる。

ある定義の人気に便乗して、その定義を別の人が別の概念で使い始めたことが間違っている、
という>>239の指摘に対して、たられば論は見苦しい言い訳にしか聞こえない。
245デフォルトの名無しさん:2013/08/11(日) 02:32:24.51
>>244
ええとね。

名前の話ではなく
概念の話をしているの。

名前で混乱してるのはお前だよ?


今普及している概念は
ストラウストラップの方。
246デフォルトの名無しさん:2013/08/11(日) 02:32:59.78
たらればではなく、
今普及している概念の話をしている。
247デフォルトの名無しさん:2013/08/11(日) 02:33:04.90
ストラウストラップの言ってるカプセル化って、フィールド変数を
パブリックメソッド使って変更するやつのことだしな
つまり、メソッドのスコープ外変数をメソッドから変更するっていう
まさに上で完全否定された処理w
それが柱w
248デフォルトの名無しさん:2013/08/11(日) 02:35:15.02
>>245
いや、これはオブジェクト指向と呼ぶんだ呼ばないんだという話をしているのだから、
概念をどういう名前で呼ぶのかという、まさに名前の定義の話だろ
そして、ストラウストラップの定義も、お前の完全なオブジェクト指向とは違うw
249デフォルトの名無しさん:2013/08/11(日) 02:35:15.02
>>247
フィールド変数一つに対して
それを変更するだけのメソッドを一つ作ると
考えてるのはお前だけだと思う。

わかってないなぁ。
250デフォルトの名無しさん:2013/08/11(日) 02:36:39.69
>>249
誰も変更するだけだとは言ってないし、一つだとも言ってないが?
しかも、スコープ外変数への再代入の話なんだから、
回数やら他の処理やらは議論と何の関係もないが?
251デフォルトの名無しさん:2013/08/11(日) 02:36:56.31
>>248
別の名前にするべきといったのはお前じゃん?
同じ名前にするのが悪いんでしょ?

じゃあ別の名前にしましょうよ。
252デフォルトの名無しさん:2013/08/11(日) 02:37:25.86
>>251
してもいいけど、で?
253デフォルトの名無しさん:2013/08/11(日) 02:38:17.55
>>250
そうか?
なら疑問が出るんだが?

プライベートなフィールドを変更するのは
パブリックなメソッド以外何があるんだ?
254デフォルトの名無しさん:2013/08/11(日) 02:40:15.10
>>252
別の名前にしたらはっきりする。
ストラウストラップの方の
○○指向が普及しており、
オブジェクト指向は普及していない。

これはたらればの話ではなく
事実を言ったまで。
255デフォルトの名無しさん:2013/08/11(日) 02:41:28.98
>>254
で?
Smalltalkをオブジェクト指向じゃないといった赤っ恥を取り繕ったつもり?w
256デフォルトの名無しさん:2013/08/11(日) 02:42:12.30
オブジェクト指向という大分類の中に
・メッセージ指向
・クラス指向
の二つがあるというだけの話だろ。
どっちが完全だの起源だのそんな話はどうでもいい。

そして現在このスレで語られている概念や、
世間で「オブジェクト指向開発」という場合の概念は、
どちらもクラス指向のことを指していることは明らか。

今Smalltalkの話を持ち出すのは本物のバカ。
どういう脳みそしてればメッセージ指向の話をしていると勘違いできるんだよ。
257デフォルトの名無しさん:2013/08/11(日) 02:42:24.13
>>255
それ俺じゃないw
258デフォルトの名無しさん:2013/08/11(日) 02:53:19.56
やはりム板にID制の導入は必要ではなかろうか
259デフォルトの名無しさん:2013/08/11(日) 02:54:08.57
ID無いのに決めつける奴が馬鹿なだけ。
決めつけたセリフを言わなければいい。
260デフォルトの名無しさん:2013/08/11(日) 02:56:31.78
ぶっちゃけIDある方が騙されやすいんだけどねw
だって俺、スマホ以外にプロバイダ2契約してるもの
(バックアップと負荷分散を兼ねて)

その気になればID二つ使って一人で会話できるよ?w
261デフォルトの名無しさん:2013/08/11(日) 02:58:00.44
>>260
プロバイダなんて月々1000円程度しかかからんから複数契約は珍しくない
俺も複数契約してるがバックアップやら負荷分散なんて大仰な目的じゃなくて、
くだらない目的で使ってるだけだがな。
262デフォルトの名無しさん:2013/08/11(日) 02:59:22.84
珍しい珍しくないの話じゃなくて
ID制が意味ないって話だろ
頭にウジでも沸いてんのか?
263デフォルトの名無しさん:2013/08/11(日) 03:10:05.85
>>262
プロバイダ2つごときで「バックアップと負荷分散♪」なんてドヤ顔してる子を温かい目で見守ってやれるほど大人じゃないんでねw
264デフォルトの名無しさん:2013/08/11(日) 03:10:43.11
ストラウストラップが別の名前をつけていたとしたらそちらが普及していたってのはかなり疑問
例えば、言語設計者がどちらの用語を使うかが普及にとって大きな鍵だが、言語設計者の間では
Smalltalkは別にマイナーではなく、超有名言語
C++より影響力が大きいかもしれない
Objective-Cのオブジェクト指向もJavaのオブジェクト指向も
Smalltalkの影響があるし
このスレの話題に出てきてるJavascriptはクラスベースとも違うだろ
そもそも、C++が登場した当初、
>>220の要件を満たしていたのか?w
265デフォルトの名無しさん:2013/08/11(日) 03:17:20.20
>>264
> Smalltalkは別にマイナーではなく、超有名言語
> C++より影響力が大きいかもしれない

> Objective-Cのオブジェクト指向もJavaのオブジェクト指向もSmalltalkの影響があるし

ソースくらい出せよ妄想君。
266デフォルトの名無しさん:2013/08/11(日) 03:22:30.55
お前のようなくだらない奴のために何で俺がその労力を使わなくちゃいけないんだよw
お前がやってるのはインターネットだろ?なぜ目の前の道具を使わない?w
267デフォルトの名無しさん:2013/08/11(日) 03:23:12.33
つ wikipedia
268デフォルトの名無しさん:2013/08/11(日) 03:26:39.78
>>266
議論はハッタリやブラフを競うゲームじゃないんで。
存在しないソースを存在するように見せかけるお遊びはチラシの裏でどうぞ。
269デフォルトの名無しさん:2013/08/11(日) 03:35:30.98
>>265,268
ソースが無ければ事実と認めないと言うのなら、

>>254
>ストラウストラップの方の
>○○指向が普及しており、
>オブジェクト指向は普及していない。

のソースを提示するのが先ではないのかな
それともストラウストラップうんぬん(>>254)は妄想かな?
270デフォルトの名無しさん:2013/08/11(日) 03:38:18.32
wikipediaより

Smalltalk
Influenced Objective-C, Self, Java, PHP 5, Logtalk, Dylan, AppleScript, Lisaac, NewtonScript, Python, Ruby, Groovy, Scala, Perl 6, Common Lisp Object System, Falcon, Io, Ioke, Fancy, Dart

C++
Influenced Perl, LPC, Lua, Pike, Ada 95, Java, PHP, D, C99, C#, Falcon, Seed7

Objective-C
Objective-C(オブジェクティブ シー)は、プログラミング言語の一種。C言語をベースにSmalltalk型のオブジェクト指向機能を持たせた上位互換言語である。

Java
Smalltalk や Objective-C と同様な簡潔なオブジェクトモデルを採用している。
271デフォルトの名無しさん:2013/08/11(日) 03:43:20.80
>>270
Smalltalkの影響欄にDartが入ってる理由を具体的に述べてくれますか?
272デフォルトの名無しさん:2013/08/11(日) 03:51:30.96
たとえばDartの言語仕様のどの部分がSmalltalkに影響を受けてるのでしょうか?
あなたは「DartはSmalltalkに影響を受けている」と主張なさっているので、
当然その根拠を1つは答えられるはずですよね。

答えられないのなら尻尾巻いて逃げ出していいですよ。
弱った犬を棒で叩く趣味はないのでね。
273デフォルトの名無しさん:2013/08/11(日) 03:53:10.37
274デフォルトの名無しさん:2013/08/11(日) 04:08:18.99
ツンデレw
275デフォルトの名無しさん:2013/08/11(日) 07:12:44.79
>>263
> プロバイダ2つごときで「バックアップと負荷分散♪」なんてドヤ顔してる子を温かい目で見守ってやれるほど大人じゃないんでねw

プロバイダ・・・2つ・・・ご と き?

お前、なんの勝負してるんだ?
俺はプロバイダ5つだ!とか数の勝負してんのか?w
276デフォルトの名無しさん:2013/08/11(日) 07:17:02.74
っていうか元々のレスは
バックアップと負荷分散自慢じゃないじゃねーかw

ID自演は簡単って話じゃねーか
バックアップと負荷分散の話はあくまでおまけ。
277デフォルトの名無しさん:2013/08/11(日) 07:21:36.46
低級企業をわざわざゴミカス言語を使わざるを得ない状況に誘い込んでるだけ
言語の良しあし語る前にまずそこから
278デフォルトの名無しさん:2013/08/11(日) 15:55:33.04
>>272
えるしってるか?
だーとのさくしゃはすもーるとーくぶいえむのこうそくかでちょうゆうめいなひと。
279デフォルトの名無しさん:2013/08/11(日) 16:18:43.75
L知ってるか?
280デフォルトの名無しさん:2013/08/11(日) 16:32:20.14
>>278
言語処理系の影響が言語仕様に限定されるという視野狭窄はさておき、
DartがSmalltalkの影響下にあるわけないという272の確信が
無知であること以外のどこから来たものかすごく興味がある
Dartの言語仕様を暗記するくらい読み込んだのかな……
281272:2013/08/11(日) 16:48:41.43
へーSmalltalkって色々なところに影響及ぼしてるんだな。
sumimとかいう奴の解説間違ってるじゃねーかクソが

> 誤った傾向として、よく、「すべてがオブジェクト」であることのみが強調されがちですが、
> この文脈における「オブジェクト指向」で重要なのはむしろ“メッセージング”のほうです。
> クラスはおろか、オブジェクトですら飾りに過ぎません。
> 偉い人にもそれがわかっとらん人がけっこう多いのです。w
http://d.hatena.ne.jp/sumim/20040525/p1

>>273
の図には「Object/Smalltalk」って書いてあるぞクソが
282デフォルトの名無しさん:2013/08/11(日) 16:49:14.11
>>272
>答えられないのなら尻尾巻いて逃げ出していいですよ。
>弱った犬を棒で叩く趣味はないのでね。

いくらバトルスレとはいえ、
ここまでムキになって挑発する心理状態が分からないw
夏だからかな?
283デフォルトの名無しさん:2013/08/11(日) 16:51:14.90
>>281
ケイのメッセージングについてはオブジェクトは関係ない
Smalltalkはケイのメッセージング指向”と”オブジェクトを取り入れた言語
ゆえにお前が引用してる文章は何も矛盾してないぞ
284272:2013/08/11(日) 16:52:40.09
俺が悪いのか?
285デフォルトの名無しさん:2013/08/11(日) 17:02:58.98
       |::::::|.::.::.::.::.::.:ト、::.::.::.::.::.::.::.::.::.::.::.::.::.::.::ヽ:.::.::.::.::.::.::.::.::.::.::.::.::.',
       |::::::l!::.::.::.::l::.:| ';\::.:ヽ.::.::.::.::.::.::.::.::.::.::.:..';.::.::.::.::.::.::.::.::.::.::.::.::.::
       |::::くヽ:.l::.::.::.:|,.. -ヾ´:.:.'、.::.::.::.:ヽ:.::.::.::.::.::.l'⌒ヽ:.::.::.::.::.::.::.::.::.::
       |::::::_l_`;:l:::::::l'~j,二二...zヽ_::.::.::.::';::.::.::.::.::.|こ`ヘ::.::.::.::.::.::.::.::.::
       |:::::::゙Lh!:'、::::l:',′_づツ火´::.::.::.::.:i:: :: ::::::lヽ r ノ::.::.::.::.::.::.::.::.:
       |:::::::::| /ヾ`、:::`、  :;  ; ヽ::::.::.:.::l::::.::.::::|/ /:::::.::.::.::.::.::.::.::.:.
       l:::::l::::!'  ` ゙、:ヽ   ';.;  ゙;'、::.::.::.|::.::.:::::|_,ィ:::::::::.::.::.::.::.::.::.::.:
       |!:::|l/     ヾ;   ;.   ; `;::.::::|:::::::l:リ: .1::::::.::.::.::.::.::.::.l::.::.
         l:::| !`ヽ`     `  ';   : l::.::::|:::::/ノ  }::::::i::.::.::.::.::.::.l::.::.:
        l| !::ハ ー‐- 、_   ; j ; |::.!;:|::/   /::::::l::.::.::.::.::.:;'!::::::::
         ! l:! `,  ̄ ̄`  ;   ' イソ j〃 _,/::::::::l::::.::.::.::.:;':l::::::::
          !  ゙,      !,.-''´リ///バz'"/::::::::::l::::.::.::.::.::l::l::::::::
               l.   ,. -''V///////  /::::::::::/!:::: :: ::::/!::|::::::::
                  ̄    Y////   /:::::::::/|::!::::.::.::::::! !::ト、:::
                   レ:''´ _ -─/:::::::/´ !::!::::.::.:::::l |::| ヽ
                 /: ; . '´   /::.::./  l::l!::::.::.:::::! l::l

兄(ケイ)のメッセージングについてはオブジェクトは関係ない
Smalltalkは兄(ケイ)のメッセージング指向”と”オブジェクトを取り入れた言語
ゆえにお前が引用してる文章は何も矛盾してないぞ
286デフォルトの名無しさん:2013/08/11(日) 19:21:58.03
そりゃ、言語設計者からみたら、C++なぞ問題外(^_^;だし、
SmalltalkやLispやHaskell、Prologといった言語に見られるカリスマ性はないだろう
格が違う
287デフォルトの名無しさん:2013/08/11(日) 19:38:14.37
>>284
うん。はずかしくて尻尾巻いて逃げてもいいレベル。
288デフォルトの名無しさん:2013/08/11(日) 19:40:43.95
C++の深淵をどこまでも追い求めるバチスカーフのようなしぶとさは高評価に値すると思う
289デフォルトの名無しさん:2013/08/11(日) 19:46:14.65
>>286
Simula
クラスやガベージコレクション、継承といった
オブジェクト指向言語の「機能」を最初に実装した言語

Smalltalk
Simulaを参考にして「メッセージング」という概念を提唱し、
これにオブジェクト指向という「名前」を最初に付けた言語

C++
Simulaを参考にして「カプセル化、継承、多態性」の3点セットが
オブジェクト指向の「定義」であると最初に主張した言語

「カプセル化、継承、多態性」についてはSmalltalkは全く関係なくC++オリジナルの功績
格が違うのはどっちだろうね…w
290デフォルトの名無しさん:2013/08/11(日) 19:47:08.59
今のC++って記述はシンプルになってるけど、実際にどんな処理が入ってるのか理解するのが大変
あれ使いこなすのは相当頭良くないと無理じゃないの
291デフォルトの名無しさん:2013/08/11(日) 19:49:03.72
C++のスクリプト化がPHPやJavascriptみたいもの。
292デフォルトの名無しさん:2013/08/11(日) 19:53:22.58
C++は言語仕様は滅茶苦茶だけども「カプセル化、継承、多態性」という
現代のオブジェクト指向の最重要概念を一番最初に提唱したという功績がある

Smalltalkは名前を付けただけで中身はない
293デフォルトの名無しさん:2013/08/11(日) 19:58:45.03
>>289
> Simula
> クラスやガベージコレクション、継承といった
> オブジェクト指向言語の「機能」を最初に実装した言語

ガベージコレクションは、オブジェクト指向と直接関連しないし、そもそも実装は Lisp の方が早いでしょ。
294デフォルトの名無しさん:2013/08/11(日) 20:18:05.37
カプセル化、継承、多態性という概念が本当に専門家の間で
評価されてると思ってるのか?
実際は、糞食らえと思われてるかもよ?
実際Smalltalkの影響より大きいのかと言われると怪しいわけだし
295デフォルトの名無しさん:2013/08/11(日) 20:21:02.56
特に継承は悪者扱いされ始めて久しいな
必要ないとは言わないが、乱発はするなとか
最近では多態性も雲行きが怪しいな
javaのテンプレートが失敗だったと言われはじめたり
296デフォルトの名無しさん:2013/08/11(日) 20:25:49.61
言葉の定義を勝手に変えて混乱をもたらした挙句に、
不必要にオブジェクト指向の概念を複雑化させ、
複雑怪奇なテンプレートや多重継承を持ち込み、
多くのプログラマーを困らせた馬鹿という印象しかないわ
Smalltalkのような美しさ、創造性が微塵も感じられない
297デフォルトの名無しさん:2013/08/11(日) 20:31:52.40
>>296
お前がいくらそう思っても世間はC++由来の「カプセル化、継承、多態性」一色に染まってるからな
ノイジーマイノリティにならないように気をつけな
298デフォルトの名無しさん:2013/08/11(日) 20:31:55.18
>>286
まつもとw
懐かしいネタだなw
もう10年以上前になるのか
あの記事もう一度全文見たいな
299デフォルトの名無しさん:2013/08/11(日) 20:32:45.80
>>297
お前のいう世間が狭いんじゃね?
かなり遅れてる
300デフォルトの名無しさん:2013/08/11(日) 20:35:56.71
「カプセル化、継承、多態性」が含まれてない「オブジェクト指向言語」って例えば何がある?
まともに使われてるのはJavaScriptくらいだろ
301デフォルトの名無しさん:2013/08/11(日) 20:38:30.89
>>292
> Smalltalkは名前を付けただけで中身はない

ふーん。

アジャイル開発手法のアイデアのほとんどはケイのメッセージングのOO…というか
Smalltalkでの開発手法を拠り所にしているし、デザパタだのリファクタリングだの
IDEだの、そもそもGUIのマルチウインドウやポップアップメニュー(特に今の右クリックメニュー
やコピペ)とか、マルチフォントとか、Appleが好んで使うカラムインターフェイスだの、
それらの実装に用いられるMVCフレームワークだの、古くはC++のSTLのころからある
コレクションAPIだのもろもろSmalltalk発祥なんだけど、でも君のOOには功績ゼロなんだね。
302デフォルトの名無しさん:2013/08/11(日) 20:46:29.41
Smalltalkをそこまで持ち上げる必要もないと思うけれど、
古いから知らないからって無視していいとかにはならないと思う。
今はフリーの処理系とかあるわけだから、ちょっとくらい触って
ケイの言う「メッセージング」とか「究極の動的システム」とかの
ワケわからなさにうちひしがれるくらいの経験はしておいてもいいと思う。

http://dotinstall.com/lessons/basic_smalltalk/21103
303デフォルトの名無しさん:2013/08/11(日) 20:49:46.80
>>301
ソースは?
韓国人がすべての起源主張してるようにしか見えないんだが
アジャイルがSmalltalkを参考にしてるなんて聞いたことねーよアホが
304デフォルトの名無しさん:2013/08/11(日) 20:50:14.54
>>302
知ってるから無視してんだよボケが
305デフォルトの名無しさん:2013/08/11(日) 20:51:31.72
> 古くはC++のSTLのころからある
> コレクションAPIだのもろもろSmalltalk発祥なんだけど



> ビアルネ・ストラウストラップ(Bjarne Stroustrup)によるC++は、
> オブジェクト指向という考えをSmalltalk経由ではなく、Simulaから直接導入しています。
> 以前お会いしたときに直接聞いたところによると、ストラウストラップは大学院時代に
> Simulaのユーザーであったため、その機能をC言語に取り込みたかったというのが、
> C++の直接の開発動機だったそうです。
http://www.itmedia.co.jp/enterprise/articles/0703/26/news021_2.html

さっそく嘘ばれとるやん
C++はSmalltalkなんて全く参考にしてねーよ
306デフォルトの名無しさん:2013/08/11(日) 20:52:30.85
>>303
さすがにお前が無知なだけ
Smalltalkも本当は知らなかったんだろ?w
307デフォルトの名無しさん:2013/08/11(日) 20:55:25.59
>>305
オブジェクト指向という言葉をSmalltalkを知りもせずに再定義したバカが
ストラウストラップだというのはマジな話しっぽいな
だが、STLのコレクションライブラリを作ったのはステファノフであって、
ストラウストラップではないぞ
308デフォルトの名無しさん:2013/08/11(日) 21:01:26.81
>>306
アジャイルがSmalltalk由来って話はほとんど話題にはなってないだろ
少なくとも日本語のソースは見つからない
309デフォルトの名無しさん:2013/08/11(日) 21:03:55.27
>>308
とりあえずスクラムとXPだけだけど

http://objectclub.jp/ml-arch/magazine/365.html
先週来日したジム・コプリエンさん[*1]によると、当初、Smalltalkで実装した
フレームワークだったのを、Smalltalk部分を取り去って「なんでも入る箱」に
したのが、現在のスクラムなんだそうです。

http://www.atmarkit.co.jp/fjava/devs_bk060201/bookreview/02/bookreview02_dev.html
ケント・ベックがXPの潜在能力に気が付いたのは、テクトロニクス社の
リーダーと仕事をしていたときだといいます。Smalltalkを使って複雑な
エンジニアリングのアプリケーションをペア・プログラミングで開発している姿に
インスピレーションを受け、ソフトウェア開発の歴史に埋もれてきた多くの
実践を組み合わせながら、XPの原型を形作っていったといいます。
310デフォルトの名無しさん:2013/08/11(日) 21:05:09.09
>>309
どこからもリンクされてないページをさらっと出すとか
こんなの知らなくて当然だろ
311デフォルトの名無しさん:2013/08/11(日) 21:07:53.31
じゃあとりあえず、「ケントベック」という人物について調べてみろ
彼がSmalltlakの文かとアジャイルの架け橋的な立場にいる一人だということが分かるから
312デフォルトの名無しさん:2013/08/11(日) 21:10:40.10
>>305だってどこからもリンクされてないやん
313デフォルトの名無しさん:2013/08/11(日) 21:15:24.70
314デフォルトの名無しさん:2013/08/11(日) 21:27:29.04
>>311
知りもせずってことはさすがにないと思うな。

もっとも、ケイの目指す「究極に動的なシステム」っていうのを理解していない、
あるいは、理解は示すが賛同しかねてるっていうのはあるかもしれないけれど。
http://d.hatena.ne.jp/katzchang/20080807/p2

「オブジェクト指向」と名付けたのは、無理解もあるけれど便乗の要素のほうが
大きかったと思う。
315デフォルトの名無しさん:2013/08/11(日) 22:50:57.71
http://zerobase.hateblo.jp/entry/2013/02/24/015610
TDDもアジャイル(XP)もSmalltalkから生まれた、っていうことについて、
徐々に体得的に実感できつつある。
現代のエンジニアリングの潮流がSmalltalkに由来するということは、
そこに何か非常に重要な本質が潜んでいる可能性がある。また何か書きたい。
とりあえず現時点でほとんど確信しているのは、現代のエンジニアは
教養としてSmalltalkをやっとくといい、ということだ。
仕事でSmalltalkを書くかどうかは関係なく。
316デフォルトの名無しさん:2013/08/11(日) 23:16:26.38
おまえらプログラムの歴史にも詳しいのか
317デフォルトの名無しさん:2013/08/11(日) 23:17:44.66
TDDもアジャイルもSmalltalkが起源ニダ
318デフォルトの名無しさん:2013/08/11(日) 23:32:02.15
>>316
おまえらはあらゆることについて恐ろしく詳しいよ
同時にあらゆる事について恐ろしくおバカである
319デフォルトの名無しさん:2013/08/11(日) 23:40:10.42
lisp、smalltalk、haskell、prologが4大カリスマ言語
というに前者二つはいろんなものの起源
320デフォルトの名無しさん:2013/08/11(日) 23:42:59.62
>>314
ストラウストラップがオブジェクト指向という言葉の人気に便乗したとか
言っても理解できないだろうw
まさか自分の知らなかった言語があの誰もが知ってるc++よりも影響力があって、
そんなに、凄い言語だったなんてw
321デフォルトの名無しさん:2013/08/11(日) 23:46:01.62
>>320
あんま他人を馬鹿にするなよ
あしもと掬われるぞ
322デフォルトの名無しさん:2013/08/11(日) 23:46:12.21
>>319
あれ以上シンプルにならない Lisp と Prolog だけでいいな
323デフォルトの名無しさん:2013/08/11(日) 23:50:26.56
昔は、凄腕のハッカーが好むのがLispで、
口だけ達者でヘボコードしか書けない連中が好むのがSmalltalkだった
324デフォルトの名無しさん:2013/08/11(日) 23:53:50.40
Lisp、Smalltalkを好んだ凄腕のハッカーの
名前が知りたいんだが誰か知ってる?
ちゃんとその言語を好んでいたというソースがある人。
325デフォルトの名無しさん:2013/08/11(日) 23:56:59.97
で、そのヘボコードしか書かないSmalltalk使いが
ヘボコードを肥だめに積み上げて作ったアジャイルの潮流を
クールな君らが這いつくばって学んでいるわけですね。わかります。
326デフォルトの名無しさん:2013/08/11(日) 23:58:51.69
ヘボコードしか書かないSmalltalk使いには
何も生み出せんよ。
Smalltalkを使っていただけのユーザーなんだから。
327デフォルトの名無しさん:2013/08/12(月) 00:01:18.10
>>319
4つの言語の中で、Haskellだけは変じゃね?

もし型推論を備えた遅延評価を主とする実用的な関数型言語であれば、Mirandaだろ
Haskellの特徴大半はMirandaから引き継いだものであり、
Haskellそのものの功績は型クラスとモナドくらい
あと、Mirandaの前には、実用的な型推論を最初に実装したMLがいることも忘れずに
328デフォルトの名無しさん:2013/08/12(月) 00:02:27.55
数学や物理は這いつくばってでも学ぶ価値があるが、
ぶっちゃけプログラミングの世界はアホ的思い付きが
大手を振ってるだけで、全然学ぶ価値無いよね
習得だって片手間で余裕だし
329デフォルトの名無しさん:2013/08/12(月) 00:03:48.41
プログラミングの世界は習得が目的ではないので・・・。
的外れもいいとこだな。
330デフォルトの名無しさん:2013/08/12(月) 00:04:54.21
>>328みたいな奴は
習得した言語自慢でもしてるんだろうか?

俺、 lisp、smalltalk、haskell、prologを
習得したぜ!って。


で、何を作ったの?
331デフォルトの名無しさん:2013/08/12(月) 00:17:26.39
大して学ばなくても、出来る奴は最初から出来るし
カスは永遠にカスのまま底辺をさまよう
それがプログラミングの世界
332デフォルトの名無しさん:2013/08/12(月) 00:20:38.74
それはプログラミング以外でも同じだと思うが?
勉強だけじゃなくてスポーツでも。
333デフォルトの名無しさん:2013/08/12(月) 00:22:29.87
>>324
LISPは他に任せる。Smalltalkだけ。

ダン・インガルス、アデル・ゴールドバーグ、テッド・ケーラー、
ラリー・テスラー、ブルース・ホーンあたりは比較的名前も知られている
XEROX PARCの元Smallalk開発メンバーでいずれも天才プログラマーの類

ユーザーサイドでは、TDDやXPのケント・ベック、Wikiなどのウォード・
カニンガム、リファクタリングのマーンチン・ファウラーとかが
Smalltalk使いだったことは普通に知られているのでは?
ただ彼らのSmalltalkプログラマとしての実績がどうだったかはよく知らない。

現役Smalltalk使いだとRubyから鞍替えしたSeasideとかのアヴィ・ブライアント、
Perlから出戻りでシュウォーツ変換とかで知られるランダル・シュウォーツとか。
惜しくも先日若くして亡くなられたけど、アンドレアス・ラーブはきっと天才。
あとMVCやDCIの発案者であるトリグヴ・リエンスカウ氏もご高齢ながら現役Smalltalk使い。
334デフォルトの名無しさん:2013/08/12(月) 00:23:38.35
プログラミングは底が浅い
335デフォルトの名無しさん:2013/08/12(月) 00:24:53.60
>>327
Haskell入れるくらいなら史上最も稼いだ言語であるAPLを入れるな。
336デフォルトの名無しさん:2013/08/12(月) 00:29:47.95
Haskellコンプレックス全開
337デフォルトの名無しさん:2013/08/12(月) 00:30:41.17
なんつうか密度の問題だろうな

朝青龍は夢の中で延々と相撲のシミュレーションを繰り返していたらしいけど、

興味ない分野だと、関心を向け続けるだけでも苦痛
その点おまいらは25時間結論の出ない討論を続けてるんだから才能の塊だろ
338デフォルトの名無しさん:2013/08/12(月) 00:50:03.79
リアルに知ってるSmalltalkerがことごとく
気持ち悪いくらいSmalltalkに心酔してて
実際の言動もリアルに気持ち悪いので、
Smalltalkは特別な言語なんだと心から納得してる。
339デフォルトの名無しさん:2013/08/12(月) 00:54:20.66
じゃあ、Lispで俺が知ってるやつな
ジェームス・ゴスリン
円周率計算の当時の世界記録をLispで達成した
またJavaの作者の一人

リチャード・ストールマン
言わずと知れたGnuの創始者
emacs lispやgplなどが有名
340デフォルトの名無しさん:2013/08/12(月) 00:59:29.53
Lispだとガイ・スティールJrも有名人
341デフォルトの名無しさん:2013/08/12(月) 01:08:08.86
ガイ・スティール
Schemeの設計
並行アルゴリズム(GCのスティールのアルゴリズム等)

ピーター・ノーヴィグ
人工知能・分厚いAIの本
Googleの研究部門を率いる


っていうか、ここで話題に出るような言語はどれも有名言語だから
それなりの人物が使ってる事は多いと思うが
342デフォルトの名無しさん:2013/08/12(月) 01:24:33.89
Lisperには、JITのピーター・ドイチュとかもいれたいね

http://www.amazon.co.jp/dp/4274068471
343デフォルトの名無しさん:2013/08/12(月) 01:29:51.07
>>338
Smalltalkはある一線を超えると社会復帰が難しくなるからね
廃人直行言語、というかどちらかというと変態OSに近い環境か
344デフォルトの名無しさん:2013/08/12(月) 02:33:29.37
>>343
嫉妬うざ
345デフォルトの名無しさん:2013/08/12(月) 06:55:47.86
天才プログラマーなら現代の言語javascriptも負けてないよ
Paul Irish、Jeremy Ashkenash、Ryan Dahl
今はこうした若者の時代だよ
346デフォルトの名無しさん:2013/08/12(月) 08:43:29.23
老人たちがSmalltalkでの知識と経験でJS爆速化技術を提供し、
若者たちがモダンなクライアントサイド技術を生み出す。
いい連携じゃん。
347デフォルトの名無しさん:2013/08/12(月) 08:54:41.62
クライアントサイドって面倒だけど低能でもできる仕事だからね
348デフォルトの名無しさん:2013/08/12(月) 09:35:04.04
二人目は言語の作者だし三人目はサーバーサイドだぞw
349デフォルトの名無しさん:2013/08/12(月) 09:55:46.47
サーバーサイドってSQL組み立てて
データベースから値を出し入れするだけの
低能でも出来る仕事だからね。
350デフォルトの名無しさん:2013/08/12(月) 10:35:53.17
SQLインジェクションを全く発生させずにアプリ作るなんて
低能でも出来る仕事だからね、
351デフォルトの名無しさん:2013/08/12(月) 11:23:58.58
大事なのは、JSの爆速化なしには、
CoffeeScriptもnode.jsもないってこと。
352デフォルトの名無しさん:2013/08/12(月) 11:34:06.70
爆速化したのは、ブラウザで動く言語がJSしかなかったことと、
ブラウザ競争の渦中で、巨大企業の資本力がこれでもかと
注入されたことが大きいな。ほかのLL言語では真似できないね。
353デフォルトの名無しさん:2013/08/12(月) 11:37:42.70
>>350
まったくだ。SQLインジェクションを発生させたら
大問題であることを気づいていない。

SQLインジェクションのような簡単な脆弱性は
全く発生させないのが普通。
354デフォルトの名無しさん:2013/08/12(月) 11:42:06.12
>>352
LuaJITさんを忘れないであげてほしい
355デフォルトの名無しさん:2013/08/13(火) 00:34:28.12
>>345
Paul Irish: Google Chrome Developer Tool, jQuery, Modernizr, Yeoman
Jeremy Ashkenas: Coffee Script, Backbone.js, underscore.js
Ryan Dahl: Node.js

何が衝撃ってCoffee ScriptとBackbonejsとunderscore.jsの作者が同じってことだなw
356デフォルトの名無しさん:2013/08/13(火) 02:52:53.33
ほー
357デフォルトの名無しさん:2013/08/13(火) 09:32:11.16
もー
358デフォルトの名無しさん:2013/08/13(火) 10:12:36.89
やりませんか?
359デフォルトの名無しさん:2013/08/13(火) 12:05:50.83
ウフォッ、いい言語
360デフォルトの名無しさん:2013/08/14(水) 16:56:28.31
こっちの言語のほうがいい、いやこっちのほうが良い
って何のための議論なんだろうな・・・

ふつーに自分が一番最速で作れる言語を選べよ
361デフォルトの名無しさん:2013/08/14(水) 18:20:23.31
短期的にはそれが正しいんだけど、
その果てにあるのは老害コボラーやJavaドカタだからねぇ
362デフォルトの名無しさん:2013/08/15(木) 11:17:58.10
何も無い宇宙空間に浮いている石ころが大きいのか小さいのかは分からない
比較するモノがあって初めてそれが大きいのか小さいのかが分かるのだ
つまり、我々は比較によってモノの価値を決めており
多数の言語があれば当然比較するわけなのだ
これはいわゆる本能なのだ、世界にただ1つだけの花とかチャンチャラおかしい
ことを言って済ませるようなことはしない、かならず比較して優劣を判定している
なぜなら優劣を判定することは生物にとって有益なことだからだ
大多数が良いとするものだけが生き残るのだ
議論とはその過程なのだ

自分1人だけの判定などあまり意味がない
なぜなら1人でできることなど限られているからだ
多様な考えがあればこそ判定がより正確になるのだ
もちろん最終判断をするのはアナタだ
多数ある議論の後にアナタが使う言語はアナタが選ぶのだ
363デフォルトの名無しさん:2013/08/15(木) 15:08:01.10
発明、発見は、歴史で一回しかない。最初は、ひとつ
364デフォルトの名無しさん:2013/08/15(木) 15:24:42.38
言語だけを比較するならHaskellが最強
365デフォルトの名無しさん:2013/08/15(木) 15:33:05.82
Haskell > Python > C >> Perl > OCaml > C++ > Ruby >> C# > Java > JS > PHP
366デフォルトの名無しさん:2013/08/15(木) 15:45:08.18
このあたりが同じ
C言語の系統なのでいい。


C/C++ JS PHP  Java C#
367デフォルトの名無しさん:2013/08/15(木) 16:27:28.74
総合評価は分からないけど、関数型プログラミング適性に限定すれば、以下が妥当では?
(すべての言語について精通している訳ではないので、間違いがあれば指摘ヨロ)

FP
 ---- 壁0. 変数の壁 ----
Haskell
 ---- 壁1. 純粋性(副作用)の壁 ----
F#/OCaml/SML/Scala
 ---- 壁2. 型推論の壁 ----
Scheme/Ruby1.9
 ---- 壁3. 末尾再帰最適化の壁 ----
========<< 越えられない壁 >>========
Common Lisp/Closure/Smalltalk/Ruby1.8
 ---- 壁4. 条件判定式の壁 ----
C++11/Java8/Perl5/JavaScript
 ---- 壁5. クロージャ/ラムダ式の壁 ----
========<< 越えられない壁 >>========
C/C++/Java7/Perl4/Python...etc


[参考] 関数型言語Part5スレ(dat落ち)
http://42ch.blogspot.jp/2013/03/part5.html -- 学ばないブログ
http://fnf.ldblog.jp/archives/5885103.html -- いてつくブログ
http://www.log-channel.com/bbs/tech/1252470706/ -- 2chログチャンネル
368デフォルトの名無しさん:2013/08/15(木) 16:34:48.98
F#って全然名前出ないけどずいぶん上に位置してるんだな。
369367:2013/08/15(木) 17:18:27.31
>>367について、いくつか補足

・よく知られた言語で抜けがありました
 Erlangは壁2.の下(Schemeと同列) 、C#は壁4.の下(C++11と同列)になります

・Ruby1.9の末尾再帰最適化はオプション(=デフォルトでは無効)なので、
 その実装が不完全である(=ナンチャッテ実装、TCOモドキ)の可能性があります

・Pyhtonのクロージャは、このスレの>>157以降の議論から不完全であると判断しました

・C++/C++11、Java7/Java8、C#、Perl4/Perl5 に関しては、2chやWikipedia等の
 ネット情報から判断しているので、誤っている可能性が大きいと思います

・壁の優先順序は私の独断と偏見ですので、異論は認めます
 ただし、「壁4.条件判定式の壁」については反論意見が多いのですが、
 これは言語の基本要素であり、設計しようとしている言語が手続き型なのか
 関数型なのかについて、オリジナル言語設計者の選択した結果が反映されており、
 あまりに基本すぎるので後から(付け足しはできても)変更が難しい事柄であると考えます

>>368
F#は関数型言語であるML族の一員であり、特にMSによる.Net実行環境とVS開発環境が
充実していることから、実用性/普及度という点で(個人的には)大いに注目しています
370デフォルトの名無しさん:2013/08/15(木) 17:22:17.93
関数型でないのが登録されてるが?
371デフォルトの名無しさん:2013/08/15(木) 17:23:38.17
素晴らしい表だ
372デフォルトの名無しさん:2013/08/15(木) 17:37:50.55
間違いなくRuby厨
373367:2013/08/15(木) 17:42:51.04
>>370
比較の観点が「関数型言語」ではなく、
「関数型プログラミングの適性」ですので....
XXX型プログラミングはスタイルなので、
関数型プログラミングは非関数型言語でも適用できます
374デフォルトの名無しさん:2013/08/15(木) 17:50:38.43
constexprやTMPは駄目ですかそうですか。
375デフォルトの名無しさん:2013/08/15(木) 17:58:26.07
Haskellも変数ないけど、変数の壁ってどういうの?
Monadとかも一切使えないってこと?
376デフォルトの名無しさん:2013/08/15(木) 18:28:13.03
>>369
> ・Pyhtonのクロージャは、このスレの>>157以降の議論から不完全であると判断しました

ほとんどマトモに議論されてないじゃん。もしかしてnonlocalのことか?
377デフォルトの名無しさん:2013/08/15(木) 19:47:11.60
>>367
関数がファーストクラスかってのが一番重要な最初の壁だと思うのだが……
その観点だと、OO言語の場合、メソッドがファーストクラスオブジェクトかという
視点は外せないのでは
378367:2013/08/15(木) 19:49:11.65
>>375
値が束縛された名前は変数と呼ばれ、Haskellにはありますが、FPにはありません
そしてラムダ式が束縛された名前は関数と呼ばれますが、この関数とアトムだけを
組み合わせる、つまり変数が存在しないプログラミングスタイルがFPの特徴の一つです
379デフォルトの名無しさん:2013/08/15(木) 19:58:50.03
あと、>>367に挙がっていないけど、式志向かどうかってのも
篩として分かりやすい気がするな
380367:2013/08/15(木) 20:05:21.77
>>376
失礼、Python3では予約語nonlocalが追加された事で、
まともな(=不完全ではない)クロージャとラムダ式が使えるようになったみたいですね
次回、>>376を更新するときに訂正しておきます

あと>>376の「超えられない壁」については、上段はRuby1.9が、下段はCを除く
最後尾列の言語すべてが乗り越えてしまったので、見直しが必要かもしれません
381367:2013/08/15(木) 20:31:24.51
>>377
「関数が一級市民(ファーストクラス・シチズン)であるか否か」という視点は、
「関数型言語であるか否か」という比較では決定的な要因であると思いますが、
今回の「関数型プログラミングの適性」という比較では重要でないと考えました

ただ単に「関数が一級市民である」ことならラムダ式があれば満足できるし、
ラムダ式でなくともクロージャ(一部OOP言語のブロック)で簡潔に記述できます
また、「関数が一級市民である」ことの最も典型的な応用は関数合成だと思いますが、
カリー化されていない関数では柔軟な関数合成プログラミングには適さず、
その程度であればOOP言語のメソッド結合(チェーン)で簡単に書き換えできます

もしも
・「関数が一級市民である」ことが特徴的なコードの一例を提示でき、そのコードが
・ラムダ式やクロージャでは代用できず、
・カリー化されていない関数でも効果的で、かつメソッド結合では代用できず、
・しかも関数型プログラミングでは一般的なプログラミング技法である
ならば、この重要でない考えを撤回するでしょう
382367:2013/08/15(木) 20:33:33.02
>>381の最終行を訂正

X: この重要でない考えを撤回するでしょう
O: この(「関数が一級市民であるか否か」は)重要でないという考えを撤回するでしょう
383367:2013/08/15(木) 20:43:03.35
>>379
式指向がどうかっていうのは、「壁4.条件判定式の壁」を一般化したものですね
if や case/switch といった条件判定が構文上で式(expression)として定義されているか、
それとも文(statement)であるか、という差異になります

式指向の他の例には、return文の有無もあります
式指向であれば、return文が存在しないかオプション(省略可能)ですが、
文指向であれば、有効な値を返す手続きではreturn文が必須になります

式指向という単語は便利なので、次回、>>367の更新では採用させてもらいます
384デフォルトの名無しさん:2013/08/15(木) 20:57:08.26
>>378
関数やアトムと値を別物だと思ってる時点で
何も分かってない半可通だと分かる
385デフォルトの名無しさん:2013/08/15(木) 20:57:37.30
>>378
>値が束縛された名前は変数と呼ばれ
たしかに名前束縛がないならFPのが確かに純粋度?が高いように見えるね
ただ一言言うと、それは名前で束縛された代数的な数ではあるけど変数ではないよ
知ってるならなおさら間違えちゃ駄目でしょ
386デフォルトの名無しさん:2013/08/15(木) 21:13:45.68
>>381
その辺の取捨選択や順序づけにやや恣意性を感じると言うか……
カリー化されていることが重要だと思うんなら入れればいいし

一次元的に分けるのがそもそも無理なのではないか、とは思わないの?
言語Aはア、イの要素を満たして言語Bはイ、ウの要素を満たす的な
状況普通にあると思うしね
387デフォルトの名無しさん:2013/08/15(木) 21:28:37.69
Rubyを上に持ってきたいんじゃないの?
388367:2013/08/15(木) 21:28:45.37
>>385
言いたい事は分かるのだけれど、「値が束縛された名前」について
「変数」という単語よりも適切な概念の名称について、提案を願う

ここは言語理論板/スレではないし、変数という言葉以外に
直感的で的確なものは(自分には)考えつけないや
389デフォルトの名無しさん:2013/08/15(木) 21:36:25.65
そんなもん、Alias(別名)でいいやん

#define max 100と似たようなもんだから
マクロってのもありかな。
390デフォルトの名無しさん:2013/08/15(木) 21:36:39.63
367は、変数束縛をなるべく使わないPointfreeスタイルで書くのが
関数型プログラミングって言いたいワケか?
391デフォルトの名無しさん:2013/08/15(木) 21:36:55.87
ラベルっていうのもありかもな。
392デフォルトの名無しさん:2013/08/15(木) 21:42:15.63
Java8のSAMタイプの構文糖をクロージャだと思ってる時点で
色んな意味で無知すぎる
393デフォルトの名無しさん:2013/08/15(木) 21:49:30.17
>>392
どっちかっていうと言葉尻を捉えて必死になってるお前の方が無知に見えるよ
394367:2013/08/15(木) 21:54:56.99
>>386
>その辺の取捨選択や順序づけにやや恣意性を感じると言うか……

それは>>369で書いたように、私の独断と偏見だから恣意的そのものですよ

>>一次元的に分けるのがそもそも無理なのではないか、とは思わないの?

当然そう思うし、複数の切り口(ファセット)で総合的に評価するのが望ましいと思う
具体的には、横軸に言語を並べ、縦軸に切り口を並べた二次元の表になるだろう
でも、残念ながら2chの1カキコの範囲内では表現には限界があるので、
>>367のような(恣意的に)1次元へと切り取った表現を選ばざるをえなかった

ただし、この恣意性があるから各自の哲学/思想というか立ち位置の差異がかいま見えて、
議論(バトル)として楽しめるのではないかと思う
この表(の哲学/思想)を無理に押し付けるつもりはないし、これとは別の切り口、たとえば
>>377の「関数が一級市民であるか」を加えたり、個々の壁について優先度を変えたりした
(>>367に対する)異論/反論が出る事は、スレ的に歓迎したいし、個人的にも嬉しい
395デフォルトの名無しさん:2013/08/15(木) 21:58:16.71
> ただし、この恣意性があるから各自の哲学/思想というか立ち位置の差異がかいま見えて、
> 議論(バトル)として楽しめるのではないかと思う

まさにその通り。
立場を曖昧にした毒にも薬にもならない表なんて何の価値もない。
396デフォルトの名無しさん:2013/08/15(木) 21:59:38.28
変数束縛なんていうから難しくなるけど
要するに、証明の問題とかである

○○をXとおくと〜

みたいな文章のことだよね?
397デフォルトの名無しさん:2013/08/15(木) 22:01:41.18
恣意的な上に無知
398デフォルトの名無しさん:2013/08/15(木) 22:03:45.11
お前が無知だろw 反論しないのがその証拠
399367:2013/08/15(木) 22:07:48.57
>>389,391
エイリアス(別名)について:
 別名は実名の対比語だと思うけど、そもそも値には名前が無い訳から違和感を感じる

マクロについて:
 マクロと「似たようなもの」ということは、変数と同様に厳密性に欠けると思う

ラベル:
 これがイイかもしれないけど、「値が束縛された名前」という概念を指す言葉として、
 変数よりも一般的(常識的/直感的)かは疑問が残る

たとえば、WikipadiaのHaskellページ(日本語)では変数という言葉が使われていて、
その定義も備考で説明されている
おそらくWikipediaは非専門家向けの表現が選ばれていると考えられて、
このページの変数という単語を置き換えても大半の人から賛同できるものを選びたい

他の人の意見も聞きたいので、この件は判断を保留します
400デフォルトの名無しさん:2013/08/15(木) 22:13:35.33
「値が束縛された名前」なんて素っ頓狂なこと書いて
自分で疑問にも思わない時点でアホすぎる
401367:2013/08/15(木) 22:20:09.55
>>390
Haskellであれば、Pointfreeスタイルで書くのが関数型プログラミングらしいと思うよ

そして、副作用である「変数への再代入(破壊的代入)を一切許さない」のが、
>>367で下に位置するML族と区別するHaskellの最大の特徴であると考えていて、
それならば「変数そのものの存在を一切許さない」FPは「究極の関数型言語」だと思う
402デフォルトの名無しさん:2013/08/15(木) 22:31:01.60
あー、RubyユーザはPointfreeスタイル好きそうだね
なるほどなー
403367:2013/08/15(木) 22:36:45.45
>>392
>>369で書いたようにJavaについては素人だし、その最新動向は無知だね
もしも>>392が正解を知っているのなら、教えて欲しい
>>367の更新に反映させたいので....
404367:2013/08/15(木) 22:41:42.79
>>396
そのとおりだね

で、そのXのこと(概念)を
・証明の世界では、どんな名前が命名されていて、
・その名前はプログラミングの世界でも一般的(常識的/直感的)か?
という比較が論点になる
405367:2013/08/15(木) 22:44:18.45
>>402
どちらかというと、HaskellのPointfreeスタイルよりも、
F#のパイプライン演算子のほうが
Rubyのメソッドチェーンの発想に近いと思う
406デフォルトの名無しさん:2013/08/15(木) 22:44:50.46
f x y = 2 * (x + y)

g = ((.).(.)) (*2) (+)


fよりgの方が関数型プログラミングらしいの?
407367:2013/08/15(木) 23:16:41.69
>>406
Pointfreeスタイルが適切か否かは、扱う問題(対象領域)によりけりだと思う
少なくとも問題が>>406の単純な計算式であれば、f のほうがHaskellらしいでしょ?
でも、問題が大きくなった時に、それをPointfreeスタイルで書けるような部品(関数)へ
適切に分解できるようにする発想(思考の転換)は、究極の関数型プログラミングへの
第一歩だと思うよ

Pointfreeスタイルで書くことは(表現の)手段であって、目的ではない
プログラミングという行為を、再利用可能な部品への分解と見立てることが
関数型プログラミングらしさ、つまりスタイルだと考える

あと、究極への道はFPだけではないよ
関数と写像よりも抽象化した圏と見立てる発想、Haskellのモナドも究極への第一歩
Haskellは圏論の一部を利用しているけど、もし基礎から圏で構成した言語が登場すれば、
それもまた究極に関数型言語と呼ぶにふさわしいのではないかと思う(妄想だけどねw)
408デフォルトの名無しさん:2013/08/15(木) 23:18:30.75
>>367
お前の話はつまらん。
Haskellファンだか関数型ファンだか知らないが、
スクリプト言語語る場にのこのこやってきて
目的外使用を想定した適不適のわけのわからんレッテル貼りして
揚げ足取りして悦に入る以外に何がやりたいのかさっぱり分からない。
関数型したいなら黙ってHaskellでも使ってりゃいいじゃん。こっち来るな。
Haskellだの関数型だのの宣伝がしたいなら、もっと賢いやり方があるだろう。
409367:2013/08/15(木) 23:19:19.47
とりあえず、ここまでの指摘について>>367を更新しました

FP
 ---- 壁0. 変数の壁 ----
Haskell
 ---- 壁1. 純粋性(副作用)の壁 ----
F#/OCaml/SML/Scala
 ---- 壁2. 型推論の壁 ----
=====<< 越えられない壁 >>=====
Scheme/Erlang/Ruby1.9
 ---- 壁3. 末尾再帰最適化の壁 ----
Common Lisp/Closure/Smalltalk/Ruby1.8
 ---- 壁4. 式指向(条件判定式)の壁>> ----
=====<< 越えられない壁 >>=====
C++11/Java8/C#/Perl5/Python3/JavaScript
 ---- 壁5. クロージャ/ラムダ式の壁 ----
C/C++/Java7/Perl4/Python2...etc


[変更点]
・Erlang と C# を新規に追加 -- >>369
・PythonをPython3とPython2へ分離 -- >>380
・壁4.の定義を変更 -- >>383
・「越えられない壁」を移動 -- >> 383

・壁0.の「変数」という単語については保留中 --> 399
・Java8については保留中 -- >>403
410デフォルトの名無しさん:2013/08/15(木) 23:29:09.01
式指向(条件判定式)の壁って何?
411デフォルトの名無しさん:2013/08/15(木) 23:31:02.92
再利用可能な部品に分ける事とPointfreeは全く何の関係もねーよ
ほんと半可通だな
412367:2013/08/15(木) 23:31:40.92
>>410

>>383を参照
413デフォルトの名無しさん:2013/08/15(木) 23:38:50.13
>>408
無知は黙っとけよ。
お前のレスが一番中身なくて邪魔。
414デフォルトの名無しさん:2013/08/15(木) 23:40:08.96
everything is an object / object oriented の対比として
everything is an expression / expression oriented という言葉がある
Lisp族をはじめとする関数型言語は普通はそうなってる
415デフォルトの名無しさん:2013/08/15(木) 23:42:37.12
C++にもJavaにも三項演算子あるじゃん
まさか、三項演算子は読み書きしにくいなんて恣意的な理由?
416デフォルトの名無しさん:2013/08/15(木) 23:43:53.44
Python は sortedlist = lst.sort() とかする初心者が後を絶たないから教育言語失格
417デフォルトの名無しさん:2013/08/15(木) 23:47:09.70
こんな挙動を示すRubyが式指向とか、無いわー

x = for i in 1..10
        i * i
    end
p x #=> 1..10
418デフォルトの名無しさん:2013/08/15(木) 23:49:56.48
返り値が必要な場合にまで for 使う人はいないんよ
419デフォルトの名無しさん:2013/08/15(木) 23:52:54.37
>>417
すげえ直観に反する動作だな
CLのLOOPマクロみたいなリスト内包もどきでもないし
最後に評価した値でもない
何でそうなるんだ?
420デフォルトの名無しさん:2013/08/16(金) 00:05:01.45
式指向にわざわざ(条件判定式)って付けてたのは
Rubyが条件式以外はキモい挙動だからか
421デフォルトの名無しさん:2013/08/16(金) 00:13:26.83
関数型が優れてるという前提なのか?
関数型はあまり使われてないし、基本文法よりも
有名な、追加のライブラリ次第でシェアや使いやすさは変わるが。
422デフォルトの名無しさん:2013/08/16(金) 00:18:34.54
>>419
Rubyの for x in xs; ... end は xs.each{ |x| ... }、つまりメッセージ指向的に言うと
xs への each{ |x| ... } というメッセージ送信のシンタックスシュガーなので
eachというメソッドがレシーバを返す仕様がゆえに for でも xs が返るという流れ。
423デフォルトの名無しさん:2013/08/16(金) 00:33:20.47
eachじゃなくてinjectのシンタックスシュガーであるべきだったね > Rubyのfor
424デフォルトの名無しさん:2013/08/16(金) 00:35:50.20
>>422
なるほどメソッドチェーン用にselfを返すようになってるメソッドを
そのままforに転用してるからか
説明されれば理屈としては分かるが、for式の値として見ると気持ち悪いな
425デフォルトの名無しさん:2013/08/16(金) 00:42:53.88
関数型に売りがあるのはまあ分かるんだけど、
よくよく聞いてみると、その多くにはトレードオフがあって、
結局のところ無理をしたり何かをねじ曲げたりするか(例えば要求仕様とかw)
逆に関数型側の大事な何かを(例えばSchemeやOCamlやScala程度には)
諦めない限り、既存の言語を置き換えるまでには使えない代物って印象だなぁ。

これは半分冗談だけど、本当にそんなに良いことばかりなのであれば
たとえばAPLなみhttp://www.youtube.com/watch?v=a9xAKttWgP4
さくっと、そして関数型の売りの一つである見通しのよさと美しさを
実感できるライフゲームを組んでみて欲しいと常々思う。(反語的に)
426デフォルトの名無しさん:2013/08/16(金) 05:46:16.34
python初心者なんですが、
from OOO import*
として複数のファイルからdef main():
のみ実行している?のですが、
ex.)
main.py
#!/usr/bin/env python
import OOO
p = OOO.OOO
(以下略

OOO.py
class OOO(以下略

とあって form OOO import* とimport OOOについて、
from OOO import* はあまりおすすめしないと書いてあったのですがその理由がわかる人がいたら
ご教授願います
427デフォルトの名無しさん:2013/08/16(金) 07:01:27.92
>>426
マルチ乙
428デフォルトの名無しさん:2013/08/16(金) 10:54:02.75
型推論もLispマクロも無いのに
関数型に近づけてもメリット無いよね

つまり、Rubyはウンコ
429367:2013/08/16(金) 16:43:45.42
>>415
三項演算子は少し前に派生スレの「[JavaScript] スクリプト言語34 [Perl,Python,PHP]」で
議論があったけど、条件分岐 if が式で三項演算子もある Ruby であれば、
三項演算子を使うのはその式が1行に収まるくらい単純な分岐の場合、
あるいは条件分岐が入れ子になった時に最も深い分岐で使うのが効果的

a = if cond1
    cond1a ? v11 : v12
  elsif cond2
    cond2a ? v21 : v22
  else
    cond3a ? v31 : v32
  end
430367:2013/08/16(金) 17:07:08.55
>>421
>>194でも書いたけど、Rubyでは、たとえば以下のような関数型プログラミングの
スタイルは、すでに特異なものではなくなっている
  collection.select { |e| ..... }.map { |e| .... }.sort { |x, y| ....}
もちろん可変オブジェクトの使用がゼロ、つまり純粋関数型プログラミングではないが、
大域的な可変オブジェクトを極力減らし、できる限り(Rubyであれば上記コードのような)
不変オブジェクト間の演算で計算を進める方向性が見える

関数型が優れているのか?という疑問に関しては、高品質コード設計では優れているが、
効率面では再代入(=破壊的代入)が基本である手続き型に劣るだろう
ただし、これも(Rubyは純粋関数型ではないから、)性能面でボトルネックとなっている
部分を手続き型で書き、それをメソッドやクラスで隠蔽するといったコード設計ができる

あるいは絶対的な効率が重視されるプロジェクトであれば、>>409の壁1.と壁2の間に
位置する静的型付け関数型言語を選ぶことで、コード品質と効率を両立できる
大規模Webサイト開発でサーバサイドのフロントエンドをRailsで、バックエンドを
Scala(およびJava)で採用したという事例があるけど、これはベストマッチだと考える
431367:2013/08/16(金) 17:21:02.57
>>417-424
反復(for や while の構文)での返り値が不可解であることは、同意する

言語仕様が実装に依存するというのは、言語設計として好ましい事柄ではない
おそらく(>>423が提案する)injectを基本にした仕様とするか、あるいは
単純に nil を返すという決定を下すだけでよかったと思うが、Rubyの残念な一面だ

ただし、>>418が指摘しているように、Rubyの関数型プログラミングでは、
for/while構文を無理して使うよりも、(>>430のコード例のような)Enumuratorを
使うのが一般的なので、現実のプログラミングでは問題にはならないと思う
実際のところ、他にも不可解な返り値にはクラス/メソッド定義にもあるけど、
反復を含めてこれらの返り値を参照するコードを書いた記憶が(自分には)無い
432デフォルトの名無しさん:2013/08/16(金) 17:22:19.77
>>429
そんなスタイル見たことない
433デフォルトの名無しさん:2013/08/16(金) 17:31:27.15
>>431
実装に依存する部分は言語仕様じゃないんじゃないの?
434デフォルトの名無しさん:2013/08/16(金) 17:52:20.43
三項演算子を使うやつはバカ
435デフォルトの名無しさん:2013/08/16(金) 17:57:50.52
>>434
同意
436367:2013/08/16(金) 18:01:30.79
>>432
そりゃそうだろね
条件判定が入れ子になるような複雑なロジックで、なおかつ最も深い条件判定が
1行に収まるケースなんてレアケースだから、見たことないのも無理はない
言い換えると、if ... else ... という条件判定が式指向である言語にとって、
三項演算子の重要性は低いということ

また、そもそも>>409の「式指向の壁」を越えた言語よりも越えられない言語のほうが
利用者の数(=シェア)では圧倒的に多いのだから、関数型プログラミングのスタイルに
とまどいを感じるプログラマが少なくないのも無理からぬ話だと思う
437デフォルトの名無しさん:2013/08/16(金) 18:12:56.58
>>434,435
なんで?
438367:2013/08/16(金) 18:28:16.48
>>433
現実世界で「動いているものが仕様である」という考え方はよく見かける
で、このRubyの「不可解な返り値」のように実用上の問題が無いのであれば、
それを「些細な事柄」として無視する現実的な判断は、決して間違いではないと思う

ただし、これが「些細な問題」ではなく「無視できない問題」になるのは言語処理系の開発
たとえばRubyはISO/JIS規格化されたけど、その範囲は全体のごく一部にすぎない
それ以外の多くはMRI(Matzが開発したC実装)の「動いているものが仕様である」に従う
Ruby実装にはMRIの他にいくつか登場しているけど、どれも開発には苦労していると思う

逆に、言語仕様のすべてが文書化されているのは、(自分の知る限り)>>409中ではSMLだけ
SMLは、構文仕様はもちろんのこと、その意味論についても操作的意味論によって
言語のすべての範囲について「形式的仕様」が定義され、文書として出版されている
実用性ではF#やOCamlに劣るかもしれないが、言語処理系の研究者/設計者にとって
SMLは「理想の姿」であり、(日本を含む)世界のあちこちで処理系が開発されている
439デフォルトの名無しさん:2013/08/16(金) 18:38:47.56
そもそも不可解ってほどでもないなあ
nil を返されるとそれ以上何もできない
だったら有用性の面から self 返しとくってのは合理的ではないかと

inject ベースの for が何を指すのかよくわからないけど
新しいオブジェクトを作って返すのならコピーのコストがかかるから
for の用途にはそぐわないだろう
440デフォルトの名無しさん:2013/08/16(金) 19:18:23.02
>>439
たぶんLispのdolistみたいなものを想定してるんじゃないのかな
アキュミュレータを使わなければただのforeach的なループと同等で、
アキュミュレータを使えばinjectっぽいことができる
dolist式の値はアキュミュレータの最後の値だからコピーのコストは気にする必要はない
foreachっぽいことをやるだけならnilになる
441デフォルトの名無しさん:2013/08/16(金) 19:55:46.01
チェインでパイプしてくのが関数的なら
今のjavascriptも変わらんだろ
442デフォルトの名無しさん:2013/08/16(金) 20:34:01.62
>>440
ごめんコピーじゃないね
(アキュムレータに)溜めこむ過程のコストって言えばよかった

いずれにしても for/each はあくまで foreach 的なループができればそれでいいな
ベクトルの異なる複数の機能を詰めこんであると学習しにくくなるしコードが読みにくくなる
443デフォルトの名無しさん:2013/08/16(金) 22:03:55.10
>>429
Rubyにif式と三項演算子の両方があるとか、無いとか、そんな話は全然関係無くて
条件分岐を式で書けるか否か、という話だろ

C++やJavaは三項演算子があるので、条件分岐式が存在する
それにも関わらずC++やJavaが式指向の壁の下に居るのは何故だ?
単に367の主観に過ぎないだろ?

まあ、主観だから100%悪いとは言わないけど、
大体、参照透過や型推論や末尾再帰最適化やクロージャの有無に比べて
主観が入りすぎてて気持ち悪い
444デフォルトの名無しさん:2013/08/16(金) 22:12:58.27
あと、Common Lispは末尾再帰最適化する処理系が多いのに、
デフォルトで末尾再帰最適化がオフのCRubyより下に居るのも変だと思うよ
445デフォルトの名無しさん:2013/08/16(金) 22:13:01.41
三項演算子で人をバカかどうか判定しているやつはバカ
446デフォルトの名無しさん:2013/08/16(金) 22:26:05.10
ただのRuby厨なんだからそっとしといてやれ
447デフォルトの名無しさん:2013/08/16(金) 22:43:48.65
パターンマッチの壁が無いあたりが
Ruby厨の限界を表している
448367:2013/08/16(金) 22:53:17.12
>>443
>Rubyにif式と三項演算子の両方があるとか、無いとか、そんな話は全然関係無くて
>条件分岐を式で書けるか否か、という話だろ

もちろんそのとおりで、三項演算子の有無は評価基準とは無関係だ

>C++やJavaは三項演算子があるので、条件分岐式が存在する
>それにも関わらずC++やJavaが式指向の壁の下に居るのは何故だ?

前段で書いたように、三項演算子の存在は評価とは無関係だよ
C++やJavaには条件判定の基本要素として if ... else .... があるけど、
これが構文上で式(expression)ではなく文(statement)として評価されていることを重視する
もしC++やJavaが式指向であれば、HaskellやMLといった関数型言語と同様に
最初の言語設計の時点で、if ... else .... は式として定義する判断がなされていたはず

>大体、参照透過や型推論や末尾再帰最適化やクロージャの有無に比べて
>主観が入りすぎてて気持ち悪い

参照透過性は「壁1. 純粋性(副作用)の壁」に含まれるし、他も評価基準に含まれているよ
>>369,394で書いたように壁の順序には(自分の)恣意性があることは認めている
「気持ち悪い」という主観的な感情を吐くだけよりも、>>443が平等と考える
評価基準と並びを提示するほうが、議論(バトル)として有意義なんジャマイカと....
449デフォルトの名無しさん:2013/08/16(金) 22:59:44.97
関数型ワナビーのル厨か。
気持ち悪いの二乗だよ。
こりゃまためんどくさいのが居着いたな。
450367:2013/08/16(金) 23:03:26.35
>>444
仕様として明記されているSchemeと区別する意味で未実装と判定したのだけど、
Common Lispの実用的な処理系の大半で、末尾再帰最適化は実装されているのかな?

もしその通りであれば、言い換えると誰からも反論が無ければ、
自分の無知であったので、>>409を次回に更新する時にCommon Lispの位置を訂正します
451デフォルトの名無しさん:2013/08/16(金) 23:05:32.63
つまり、C++やJavaにif-elseがなければ式指向ということだな?
関数型らしからぬ機能があるのがダメだということはRubyは相当下になるのでは?
452デフォルトの名無しさん:2013/08/16(金) 23:06:05.14
> 仕様として明記されているSchemeと区別する意味で未実装と判定したのだけど、

Rubyだって仕様に明記されてないのに、しれっとSchemeと並べてるのがRuby厨すぎるわ
453デフォルトの名無しさん:2013/08/16(金) 23:07:12.99
>>447
それは思った。名前束縛の件もそう。
やっぱり言う割にまともに関数型言語使ってないんだな。
454367:2013/08/16(金) 23:15:12.98
>>443
構造的等値なパターンマッチ機構が便利であることは確かで壁の候補として検討したけど、
>>409の(FPを除く)壁2.より上に位置する言語ではすべて実装されているし、
壁2.より下では Erlang だけのように見える(他にもあるかな?)
だから、Erlangを区別するだけのパターンマッチは、
評価基準として「壁2. 型推論の壁」よりも弱いと考えました
455デフォルトの名無しさん:2013/08/16(金) 23:17:13.01
お前、erlangファンを舐めてるのか?あん?
456デフォルトの名無しさん:2013/08/16(金) 23:18:39.88
そんなこと言ったら壁0や壁1も一つの言語しか区別してないだろ

ていうか壁0って誰得だよ?lazy Kやunlambdaみたいな実用的じゃないものを並べてんじゃねーよ
457デフォルトの名無しさん:2013/08/16(金) 23:23:21.09
>>453
しょせんワナビー
458デフォルトの名無しさん:2013/08/16(金) 23:28:06.20
AgdaやCoqも加えてあげてください
459デフォルトの名無しさん:2013/08/16(金) 23:31:25.22
SBCLは末尾再帰最適化されているな
clispはコンパイルすれば最適化される
460367:2013/08/16(金) 23:33:28.09
>>451
>つまり、C++やJavaにif-elseがなければ式指向ということだな?

何を言いたいのか、意味が分からない

if-elseの無いC++やJavaに、プログラミング言語として何の意味があるの?
無意味な仮定を持ち出して決めつけを行うのは「詭弁(きべん)」だよ


>関数型らしからぬ機能があるのがダメだということはRubyは相当下になるのでは?

いちども「関数型らしからぬ機能があるのがダメ」とは言っていないはずだが、
これも何を言いたいのか、意味が分からない

条件判定はあらゆるプログラミング言語に存在する基本要素だよね
関数型プログラミングでも、条件判定式は関数適用式やラムダ式と組み合わせて、
プログラムのあらゆる箇所で使われる
だから if ... else ... という基本構文が式であることを重要視しているだけのこと
461デフォルトの名無しさん:2013/08/16(金) 23:35:29.73
>>360
>if-elseの無いC++やJavaに、プログラミング言語として何の意味があるの?
>無意味な仮定を持ち出して決めつけを行うのは「詭弁(きべん)」だよ
別人だけど俗に言うc-likeなら3項演算子があるだろう
462デフォルトの名無しさん:2013/08/16(金) 23:35:33.73
Rubyは適当にパーサ作ったら偶々いろんなものが値を返すようになっただけで、
関数型うんぬんなんて高尚(?)なもんじゃない


こんな意味不明な動作をする言語だよ?

x = 1
p(x + x = x + x = x + x) #=> 4
463デフォルトの名無しさん:2013/08/16(金) 23:37:06.17
>>461
367は三項演算子で条件分岐できるのが分かってない予感
464デフォルトの名無しさん:2013/08/16(金) 23:39:43.25
複数ステートメントについてもC#などラムダのあるC系なら
a = cond1 ?
  (() => { X; Y; })()
 : cond2 ?
  (() => { Z; })()
 :
  W;
と書けないことはないな
465367:2013/08/16(金) 23:40:29.66
>>455,456
わかったw、Erlangファンの意志を尊重し、
>>409を次回更新する時に「パターンマッチの壁」を追加することを約束します

なお、壁0. についても、過去に(関数型言語スレで)指摘されたことで
後から追加したことを補足しておきます

>>458
AgdaやCoqは(プログラミング言語ではなく)証明系なので、却下します

>>459
これは>>450への肯定的なレスですね
466デフォルトの名無しさん:2013/08/16(金) 23:41:48.71
Pythonを下げてRubyを上に上げた意味が一番わからない
食わず嫌いじゃないのか?
それと関数型風に出来ればいいならC++98だってboost-phoenixみたいのもある
基準が変だよ
467デフォルトの名無しさん:2013/08/16(金) 23:46:50.78
>>462
何でそうなるんだ?
468デフォルトの名無しさん:2013/08/16(金) 23:56:07.17
459は何も450を肯定してねーだろ
しったかなやつだなーと
469デフォルトの名無しさん:2013/08/17(土) 00:01:52.98
>>466
これの上の部分の詳細を書くとPython2.5で既にlambdaもif式もあった
それでRubyだけ何で特別扱いなんだ
470367:2013/08/17(土) 00:05:43.05
>>461,464
・if-else構文と三項演算子があるC系言語において、使用比率はif-else構文が圧倒的に多い
・C系言語でも(if-else構文をあえて使わず)三項演算子だけでプログラムを
 「書けないことはない」が、if-else構文を使う方がC系らしいプログラミングであるし、
 可読性も(三項演算子だけよりも)if-else構文のほうが優れている

これは事実だと思うけど、いかがかな?

そして、それだけ条件判定としての if-else 構文は重要な要素だと評価したことで、
if-else構文が式であるか否か、すなわち式指向であるか?を壁として選んだ
ただ、それだけのこと
471デフォルトの名無しさん:2013/08/17(土) 00:07:00.93
本当に主観だけで決めてるな
ランク製作者の独断できまるランキングスレなんて初めて見た
472デフォルトの名無しさん:2013/08/17(土) 00:10:51.28
>>470
で、Rubyにおいてif-elseの式の値を利用していることはどれくらいあるだろう?
それはC言語における ?: / if-else の割合と比較して有意に大きいと言えるの?
473デフォルトの名無しさん:2013/08/17(土) 00:11:47.43
こんなに綺麗な論破初めて見たw
474367:2013/08/17(土) 00:17:52.18
>>466
>Pythonを下げてRubyを上に上げた意味が一番わからない
>食わず嫌いじゃないのか?

>>409は「関数型プログラミングの適性」について(>>367)、
「関数型言語が上に手続き型言語が下に並ぶ」よう、壁とその位置を考えただけですよ
Pythonが下にあることがご不満なようですけど、そうであれば
「関数型言語が上に手続き型言語が下に並び」かつ「Pythonが上位に来て」しかも
「客観的な(=できるだけ恣意性を排除した)」ものを提示すればいいんジャマイカと....

>それと関数型風に出来ればいいならC++98だってboost-phoenixみたいのもある
>基準が変だよ

関数型プログラミングはスタイルですから、あらゆるプログラミング言語に適用できます
ただし、その適性度には言語によって差異があるという話です
C++の例であれば、特定のライブラリを利用しなければ関数型プログラミングに
適さないC++98よりも、最初から言語仕様として規定されているC++11は上位になります
475367:2013/08/17(土) 00:35:03.62
>>472
Rubyの関数型プログラミングにおいて(変数の再代入を避ける為に)
「if-elseの式の値を利用」することは基本中の基本であり、
その比率は(同「値を利用しない」ケースと比較すれば)圧倒的に多いよ

以下の文書の節「変数を更新してはいけない」と「あらゆるすべてが式である」を参照
・Rubyによる関数型プログラミング -- Functional programming with Ruby
 http://www.h6.dion.ne.jp/~machan/misc/FPwithRuby.html

実際にこの文書に沿って、10数キロステップの実用的なRubyプログラムの開発に
関数型プログラミングの適用を試してみたが、
そのおよそ70%で純粋な(=副作用の無い)コードを書くことができた
その70%の中で「if-elseの式の値を利用」することは当たり前(=100%)だし、
保守性を重視して(コードの短縮よりも)読みやすいコードを意識したから、
三項演算子は一度も利用することは無かった
476デフォルトの名無しさん:2013/08/17(土) 00:37:49.70
>>474
>最初から言語仕様として規定されているC++11は上位になります
C++11はconstexprを含んでその位置なのか?
if-elseもないし定数への展開じゃなければ
コンパイラが末尾再帰最適化もしてくれるが
477デフォルトの名無しさん:2013/08/17(土) 00:43:48.50
理解できた
パイプでつなぐようなスタイル(Haskellのポイントフリー)が
関数型スタイルだって言ってるのか
心の底からRuby厨だわな
根本的なところで違うんだからそりゃ話が咬み合わないわけだ
478デフォルトの名無しさん:2013/08/17(土) 00:44:31.11
>>475
圧倒的に多いと言える根拠は?
三項演算子の一般的な利用頻度にかかわらずC系で三項演算子を使えば関数型っぽくはなるが、
そうではなくて>>470は一般論としてどっちが多いかの話じゃなかったの?
479デフォルトの名無しさん:2013/08/17(土) 00:45:20.43
無駄だよ無駄
こいつただのRuby厨だから
480367:2013/08/17(土) 00:56:09.41
>>478
「Rubyの関数型プログラミング」において圧倒的だというのは、
>>475で示した(ガイドラインとしての)文書と
(自分の個人的な)実経験が根拠であるというのは、理解してもらえるよね?

そして、「Rubyの手続き型プログラミング」であれば、そもそも
if-else式の値は参照しない、つまりC系言語のif-else構文と同じだ
で、それに関して三項演算子との使用頻度の比較は、RubyもC系も同程度ではないかと

不思議なことは何も無いと思うんだけど、何が不明なの?
481デフォルトの名無しさん:2013/08/17(土) 00:59:12.36
つまるところ三項演算子をif-elseで書けるから見やすいと言ってるだけだろう。わかるよ。
でもコードの見やすさなんていう観点を持ち込むんなら
随分とランキングは変わってくると思うけどね。
482デフォルトの名無しさん:2013/08/17(土) 01:02:37.87
もうわかっただろ
まともに使ってるのRubyだけなんだって
483デフォルトの名無しさん:2013/08/17(土) 01:03:30.55
要するに、

(Ruby厨が考えるRubyの機能の範囲で実現可能な)
関数型っぽいことが一番うまくできるスクリプト言語はRuby!

って話なんだから、こいつをひっくり返すのはかなり難しいよw
484デフォルトの名無しさん:2013/08/17(土) 01:08:48.32
次スレからRuby使いは排除だな
485367:2013/08/17(土) 01:09:00.46
>>469
Python2.5にはクロージャが無かった(もしくは不完全であった)からだよ

そしてPython3でまともなクロージャが採用されたことを指摘されたことで、
つまり自分の不勉強によって知らなかったことをふまえて(>>380)、
その指摘を>>409で反映し、Python3を上に位置付けた
それに何かご不満でも?

今後も、誤認の指摘や説得力のある(=客観的な)意見があれば、更新を続けます
486デフォルトの名無しさん:2013/08/17(土) 01:11:05.69
JavaScriptは? (・∀・)ニヤニヤ
487デフォルトの名無しさん:2013/08/17(土) 01:17:10.59
なんでpythonでnonlocalクロージャができると関数型になるん?
逆じゃないの?
488デフォルトの名無しさん:2013/08/17(土) 01:22:00.44
>>485
きちんと答えておかないと駄目か
>つまり自分の不勉強によって知らなかったことをふまえて(>>380)、
>その指摘を>>409で反映し、Python3を上に位置付けた
>それに何かご不満でも?
関数型のプログラミングに近いかどうかを論点にしてるのに
なんで再代入を良しとするわけ?
その観点からみたら逆でしょ?
489デフォルトの名無しさん:2013/08/17(土) 01:22:02.87
>>485
なんでnonlocalがあるとまともなんだ?
Rubyもそうだが、外の変数へ再代入できたらお前の思う関数型に近づくのか
と思ったら487が書いてた
490デフォルトの名無しさん:2013/08/17(土) 01:24:00.12
実質機能してない末尾再帰最適化を拠り所にして
Rubyが1.9で壁を越えているのは認められない。
これを許すのなら、C系言語において三項演算子で
関数型条件分岐が可能とか、もっと配慮があってしかるべき。
491デフォルトの名無しさん:2013/08/17(土) 01:24:52.00
ここまで論破され続けてもめげないのは評価するけど
本当に宗教なんだなrubyって
492デフォルトの名無しさん:2013/08/17(土) 01:26:40.31
Rubyは宗教
Perlは文学
493デフォルトの名無しさん:2013/08/17(土) 01:30:08.50
Rubyってコードブロック内から外を呼び出すような再帰は最適化できるの?
多くのケースで当てはまるはずだけど実装難しそう
494デフォルトの名無しさん:2013/08/17(土) 01:33:36.71
クロージャが不完全云々という理屈を使っていながら
C++11 > Python2とするのはよくわからんな
C++は言語仕様的に変数に暗黙的な無限エクステントを与えられないから
C++11でlambda導入されたといっても、funarg問題を解決するために
キャプチャが必要な変数に関する情報を手動で明示しないといけない仕様だぞ

とにかく目的は達成できる、という意味でC++11のクロージャが許容できるのなら
同じ理屈でPython2のnonlocalなしも許容できるだろ
上位のローカル変数に代入できないが参照はできるから、下のように書けばいいだけ

def make_accumulator():
 acc = [0]
 def add(n):
  acc[0] += n
  return acc[0]

ついでに言えばこのように環境を書き換えるのクロージャは参照透明性を持たない訳だが
参照透明性を汚すタイプのクロージャへのサポートが不十分であることが
なぜ関数型プログラミング適性において劣ることになるんだ?
自分で純粋性(副作用)を重視していることと矛盾しているとは思わないのか?
495デフォルトの名無しさん:2013/08/17(土) 11:16:47.01
>>492
宗教つーかヤバイ薬じゃね
496デフォルトの名無しさん:2013/08/17(土) 11:31:15.69
正直Rubyは体が受け付けない
コード見てオナニーする趣味はないから誰でも似たようなコードになる言語でいいよ
497デフォルトの名無しさん:2013/08/17(土) 11:53:16.79
Ruby はいい言語だけど彼のレスは体が受けつけない
498デフォルトの名無しさん:2013/08/17(土) 11:56:53.81
Javascriptは関数型ハイブリッド言語。


Javascriptのクイックソート。
Quicksort = function (xs) {
if (xs.length <= 1) return xs;
var pivot = xs[Math.floor(xs.length/2)];
return (new Array).concat(
Quicksort(xs.filter( function(x){ return pivot>x;})),
xs.filter( function(x){ return pivot==x;}),
Quicksort(xs.filter( function(x){ return pivot<x;})));
};
499デフォルトの名無しさん:2013/08/17(土) 12:46:34.60
>>495
なんせモルモン教徒が伝道活動を通じて会得した
様々なテクニックを駆使して広めた言語だからね。
喩えとかじゃなくガチで宗教だし、宗教としてもかなり特殊。
500デフォルトの名無しさん:2013/08/17(土) 12:54:11.51
>>498
マジでreturnとfunctionがうざすぎる
501デフォルトの名無しさん:2013/08/17(土) 12:56:01.69
>>500
タイピングスピード遅いの?
502デフォルトの名無しさん:2013/08/17(土) 12:56:41.28
>>501
なんでそうなる
503デフォルトの名無しさん:2013/08/17(土) 12:59:39.08
Scalaのクイックソート


def sort(xs: Array[Int]): Array[Int] = {
if (xs.length <= 1) xs
else {
val pivot = xs(xs.length / 2)
Array.concat(
sort(xs filter (pivot >)),
xs filter (pivot ==),
sort(xs filter (pivot <)))
}
}

https://sites.google.com/site/scalajp/home/documentation/scala-by-example/chapter2
504デフォルトの名無しさん:2013/08/17(土) 13:03:33.16
>>498 >>503
インデントがないとすごく見づらいってことが
よく分かるなw
505デフォルトの名無しさん:2013/08/17(土) 13:10:35.51
>>498
やっぱり駄目言語だな
506デフォルトの名無しさん:2013/08/17(土) 13:24:06.56
Prologのクイックソート

sort([], []).
sort([H|T], S) :- partition(T, H, L1, L2), sort(L1, S1), sort(L2, S2), append(S1, S2, S).
partition([], _, [], []).
partition([X|L], Y, [X|L1], L2) :- X =< Y, partition(L, Y, L1, L2).
partition([X|L], Y, L1, [Y|L2]) :- X > Y, partition(L, Y, L1, L2).
507デフォルトの名無しさん:2013/08/17(土) 13:32:19.00
せめて名前と書き方とインデントぐらい調整してやれよ。

var quicksort = function (xs) {
  if (xs.length <= 1) return xs;
  else {
    var pivot = xs[Math.floor(xs.length/2)];
    return (new Array).concat(
      quicksort( xs.filter( function(x){ return pivot > x } ) ),
      xs.filter( function(x){ return pivot == x } ),
      quicksort( xs.filter( function(x){ return pivot < x } ) )
    );
  }
};



def quicksort(xs: Array[Int]): Array[Int] = {
  if (xs.length <= 1) xs
  else {
    val pivot = xs(xs.length / 2)
    Array.concat(
      quicksort(xs filter (pivot >)),
      xs filter (pivot ==),
      quicksort(xs filter (pivot <))
    )
  }
}
508デフォルトの名無しさん:2013/08/17(土) 14:10:28.31
var quicksort = function (xs) {
  if (xs.length <= 1) return xs;
  else {
    var pivot = xs[Math.floor(xs.length/2)];
    return (new Array).concat(
      quicksort( xs.filter( function(x){ return pivot > x } ) ),
      xs.filter( function(x){ return pivot == x } ),
      quicksort( xs.filter( function(x){ return pivot < x } ) )
    );
  }
};

↓ArrayExというオレオレライブラリを作るとこうなる。

function quicksort(xs) {
  if (xs.length <= 1) return xs;

  var pivot = xs[Math.floor(xs.length / 2)];
  return ArrayEx.concat(
    quicksort( xs.filterCond(pivot, ">") ),
    xs.filterCond(pivot, "=="),
    quicksort( xs.filterCond(pivot, "<") )
  );
}

プログラミング言語力は、(言語の力で)見やすくなるかどうかだが、
プログラミング力は、(自分の力で)見やすく出来るかどうかだと思う。
言語の力に、自分の力が左右されるうちはまだまだ。
509デフォルトの名無しさん:2013/08/17(土) 14:12:36.50
Smalltalkのクイックソート

SequenceableCollection >> qsort
  ^self size < 2 ifTrue: [self] ifFalse: [
    (self select: [:x | x > self middle]) qsort,
      (self select: [:x | x = self middle]),
      (self select: [:x | x < self middle]) qsort]

#(4 2 1 3 10 7 8 6 9 5) qsort "=> #(10 9 8 7 6 5 4 3 2 1) "
510デフォルトの名無しさん:2013/08/17(土) 14:14:56.12
でもよく考えてほしい。
クイックソートを使うことはたくさんあっても
クイックソートの作成は一回だけだ。


どの言語もクイックソートを作成した後は、

配列 = quicksort(配列)

という一行になることに気づいてほしい。



そう。クイックソートに関する点では、
もはや言語の差がなくなってしまったのだ。
511デフォルトの名無しさん:2013/08/17(土) 14:24:40.91
>>509
middleって名前ありなん?

配列の数が奇数の場合の仕様が
名前からはわかりづらいから避けていたんだけど、
middleという名前がOKならこうかけるよ。

function quicksort(xs) {
  return xs.length <= 1 ? xs :
    ArrayEx.concat(
      quicksort( xs.filterCond(xs.middle, ">") ),
      xs.filterCond(xs.middle, "=="),
      quicksort( xs.filterCond(xs.middle, "<") )
    );
}

functionとreturnを使う数がそれぞれ1回、最小になった。
512デフォルトの名無しさん:2013/08/17(土) 14:30:38.95
>>511
参考まで、Squeak Smalltalkの#middleはこんなふうに定義されています。

SequenceableCollection >> middle
  "Answer the middle element of the receiver."
  ^self at: self size // 2 + 1
513デフォルトの名無しさん:2013/08/17(土) 14:54:13.77
middleありなの?とかちょっと笑える
514デフォルトの名無しさん:2013/08/17(土) 15:04:18.51
>>513
middleの仕様を
名前から判断できる?

名前から複数の仕様が考えられ、
複数の言語があったとして、
仕様がばらばらになるようなものは、
わかりにくい名前なんだよ。
515デフォルトの名無しさん:2013/08/17(土) 15:13:47.29
ああ、いや、そういうことじゃなく(苦笑
516デフォルトの名無しさん:2013/08/17(土) 15:29:01.74
そういうことって?

そもそも「middle」ありなのとは書いてなくて
「middleという名前」ありなの?だろ

お前自分の勘違いに自分で笑ってるのか?
517デフォルトの名無しさん:2013/08/17(土) 15:29:08.44
>>509
昇順で書けよ!w
518デフォルトの名無しさん:2013/08/17(土) 15:34:23.79
上から目線したら、間違ってるのが自分とわかり
このままフェードアウトするパターンですね。
519デフォルトの名無しさん:2013/08/17(土) 17:24:44.80
標準のリスト操作以外はつかったらダメだろ
そんなのがありなら最初からCoffee使えや
520デフォルトの名無しさん:2013/08/17(土) 17:45:37.68
>>511
JSよく知らないんですが、
filterCondとかmiddleは
どこにどんな処理として定義されているんですか?
521デフォルトの名無しさん:2013/08/17(土) 18:05:28.41
jsはfunctionとreturnに文字数取られてるだけっぽいな
522デフォルトの名無しさん:2013/08/17(土) 18:48:09.24
jsにfilterなんて出来たんだ
最近のjsは結構いいな
523デフォルトの名無しさん:2013/08/17(土) 19:38:37.35
>>519
普通さ、自分でライブラリ書くだろ?
俺は現実的な開発において
差がでないことに興味はないんだよ。

>>520
5分時間やるから自分で書いてみろ。
処理の内容はquicksortの処理に必要な動作だ。

>>521
> jsはfunctionとreturnに文字数取られてるだけっぽいな
俺もそう思う。

CoffeeScriptは、わざと差が出るようなコードを意図的に書いたのを除けば、
functionとreturnの文字数分、そして括弧だけの行ぐらいしか差が出ないんだよ。
でそれくらいならタイピングにかかる時間の差ぐらいしかうまれない。
524デフォルトの名無しさん:2013/08/17(土) 20:18:01.15
タイピングが面倒なんじゃなくて、コードがごちゃごちゃするのがうざい
525デフォルトの名無しさん:2013/08/17(土) 20:30:33.89
そんなあなたにそっと寄り添う CoffeeScript
526デフォルトの名無しさん:2013/08/17(土) 20:51:28.71
なんでタイピング時間って発想が出てくるの?
もしかして他のlambda式ある言語触ったこと無い?
527デフォルトの名無しさん:2013/08/17(土) 20:58:34.98
タイプ時間じゃなければ、
読む時間か?
こっちはもっと差がないと思うが?
528デフォルトの名無しさん:2013/08/17(土) 21:12:04.81
あっそ・・
そうやら根本的に相容れない人間らしいな
529デフォルトの名無しさん:2013/08/17(土) 22:50:02.05
そのままじゃ動かないコードを貼り付けて「こうかけるよ」とか
何でもありなんだな。

Rubyならこんなシンプルにかけるよ!w

def quicksort(xs)
  return xs if xs.size <= 1
  quicksort(xs.smallers) + xs.middles + quicksort(xs.largers)
end

smallers、middles、largersはクイックソートの定義そった操作だから
自分で考えてみろ。…とか許されないだろJK
530デフォルトの名無しさん:2013/08/17(土) 22:52:57.72
あ、JSの人は自分一人じゃFizzBuzzも満足に書けない人なので
他人のコードをパクって分からないところは「自分で考えろ」って言うのさ
まともに相手しても仕方ない
531デフォルトの名無しさん:2013/08/17(土) 23:06:35.48
まあ、問題はぶっちゃけ510が正解だってことだw
532デフォルトの名無しさん:2013/08/17(土) 23:12:52.36
それはない
533デフォルトの名無しさん:2013/08/17(土) 23:43:00.62
>>526
> もしかして他のlambda式ある言語触ったこと無い?

もし、触ったことがあるlambda式ありの他の言語が

\ x y -> x*y の Haskell とか
->x,y {x*y} の Ruby とか
(x:Int,y:Int) => x*y の Scala とか
[:x :y | x*y] の Smalltalk とか

だった場合はどうなるの?
534デフォルトの名無しさん:2013/08/17(土) 23:56:27.40
Haskellでは普通 \x y -> x * y なんて冗長に書かず (*) と書くので、
Haskellを使った事は無さそうだなって分かる
535デフォルトの名無しさん:2013/08/18(日) 00:02:10.18
>>529
Rubyもそれでゆるすし、
JavaScriptもそれで許します。

function quicksort(xs) {
  return (xs.size <= 1) ? xs :
    quicksort(xs.smallers).add(xs.middles).add(quicksort(xs.largers));
}


結局のところ、ライブラリのほうが重要で
言語自体では差は殆ど出ないのさ。
536デフォルトの名無しさん:2013/08/18(日) 00:05:40.83
cpan最強
537デフォルトの名無しさん:2013/08/18(日) 00:06:59.59
俺だったら、>>529はダメって言うな。

なぜなら、クイックソートを実装している最中に使う
smallers、middles、largersが
クイックソート専用の関数になっているから。

クイックソートを作るときにクイックソートを実装するために
作られた関数を使ってどうするw
汎用関数ではない。


>>511のコードのmiddleは汎用関数
(その根拠はSmalltalkで用意されているから)
だからこっちは問題ない。
538デフォルトの名無しさん:2013/08/18(日) 00:10:35.29
>>535
> quicksort(xs.smallers).add(xs.middles).add(quicksort(xs.largers))

おいおい、使わないかもしれないのにxs.smallersやxs.middlesやxs.largersを
メンバとして持ってるのか、すげー無駄だな。
アホのJS厨が考える事は分からんなー。

あ、>>529のRubyは括弧省略してメソッド呼んでるだけだから一緒にすんなよ?
539デフォルトの名無しさん:2013/08/18(日) 00:14:51.96
>>538
オマエ馬鹿じゃね?

smallers、middles、largersって
Ruby厨>>529が考えだしたメンバだぞ。
使いもしないのに持ってるんだとさ。
540デフォルトの名無しさん:2013/08/18(日) 00:15:27.66
>>539

あ、ほんとうだ!


Ruby厨って馬鹿って確信した事例の一つになった。
541デフォルトの名無しさん:2013/08/18(日) 00:20:02.06
>>538はsmallersがメンバ変数になっていることに文句をつけてるんでしょ?

逆に言えば、smallers() なら問題ないって言っているようなもんだ。
くだらね。

ちなみにsmallersのままでもプロパティにしてしまえば
メソッド呼び出しにできるので、Rubyと一緒。
542デフォルトの名無しさん:2013/08/18(日) 00:20:45.57
>>534
Scalaでも関数型言語なら演算子は関数扱いが普通
なんつうかGetStart斜め読み程度の知識で議論しようとしてるよな
543デフォルトの名無しさん:2013/08/18(日) 00:22:39.36
>>541
>ちなみにsmallersのままでもプロパティにしてしまえば
>メソッド呼び出しにできるので、Rubyと一緒。
pivotとかまでプロパティ作るの?標準リストに?
544デフォルトの名無しさん:2013/08/18(日) 00:23:47.51
5分時間やるから自分で書いてみろ。
545デフォルトの名無しさん:2013/08/18(日) 00:29:38.49
汎用性の無い関数を山のように積み上げても
ゴミの山になるだけだと思うんだけど、
そんなんで生産性が上がると思ってる奴いるんだな
546デフォルトの名無しさん:2013/08/18(日) 00:29:45.78
>>543
↓こいつにレスしてるの?

529 名前:デフォルトの名無しさん[sage] 投稿日:2013/08/17(土) 22:50:02.05
そのままじゃ動かないコードを貼り付けて「こうかけるよ」とか
何でもありなんだな。

Rubyならこんなシンプルにかけるよ!w

def quicksort(xs)
  return xs if xs.size <= 1
  quicksort(xs.smallers) + xs.middles + quicksort(xs.largers)
end

smallers、middles、largersはクイックソートの定義そった操作だから
自分で考えてみろ。…とか許されないだろJK
547デフォルトの名無しさん:2013/08/18(日) 00:30:26.25
Ruby厨がクソコード書いたおかげで
尻拭いをしてることぐらい
分かれよw
548デフォルトの名無しさん:2013/08/18(日) 00:34:27.50
>>542
どんな議論だか見えないんだが?
549デフォルトの名無しさん:2013/08/18(日) 00:35:17.90
あと、リストのindexの中心をpivotにしてるのって
何か意味あるんだっけ?

xs[Math.floor(xs.length/2)]

こういうやつね。


もしかして、中央値をpivotにしようとして間違ってる?
550デフォルトの名無しさん:2013/08/18(日) 00:36:57.77
なにか反論でも有るの?

Rubyならこんなシンプルにかけるよ!w

def quicksort(xs)
  return xs if xs.size <= 1
  quicksort(xs.smallers) + xs.middles + quicksort(xs.largers)
end
551デフォルトの名無しさん:2013/08/18(日) 00:38:14.96
>>550

使わないかもしれないのにxs.smallersやxs.middlesやxs.largersを
メンバとして持ってるのか、すげー無駄だな。

汎用性の無い関数を山のように積み上げても
ゴミの山になるだけ

pivotとかまでプロパティ作るの?標準リストに?
552デフォルトの名無しさん:2013/08/18(日) 00:39:30.77
>>548
立場的にどんな場面でもfunctionとreturnキーワードは有用って主張でしょ?
じゃなきゃいちいち否定する理由がないじゃない。
553デフォルトの名無しさん:2013/08/18(日) 00:40:18.49
>>549
うわあ恥ずかしい
お前が
554デフォルトの名無しさん:2013/08/18(日) 00:42:05.91
>>553
え?マジで説明してよ
555デフォルトの名無しさん:2013/08/18(日) 00:42:52.70
>>549
> もしかして、中央値をpivotにしようとして間違ってる?

中央値ってメディアンのこと?
あれは配列の数が奇数なら、中央値取ってこれるけど、
配列の数が偶数なら、中央に近い二つの値の平均になる。
だからクイックソートのpivotとは違う。

だから計算した方がいいと思ったが、
smalltalkではmiddleというメソッドが有るらしい。
>>509 >>512 参照)

ならsmalltalkの真似でmiddleという名前を使うのはありかもしれない。
俺自身は一般的ではないと思ってるけどね。


でもさすがに>>550、このRubyコードはダメだw
556デフォルトの名無しさん:2013/08/18(日) 00:43:57.16
>>552
> 立場的にどんな場面でもfunctionとreturnキーワードは有用って主張でしょ?

だれもfunctionとreturnが有用なんて言ってないと思うけど?
タイプする文字が多い程度の弊害はあると。
557デフォルトの名無しさん:2013/08/18(日) 00:44:10.79
>>554
真の中央値調べられる時点でソート終わってるだろ
558デフォルトの名無しさん:2013/08/18(日) 00:45:25.88
>>556
だからそれじゃ不要だという事を否定する根拠にならないだろ
言ってることめちゃくちゃだ
559デフォルトの名無しさん:2013/08/18(日) 00:46:13.02
>>555
もちろん偶数のときは、中央に近い2つの値のどちらかを取る形式で
560デフォルトの名無しさん:2013/08/18(日) 00:46:23.45
>>529について、メソッドsmaller, middler, larger を前提としない、
そのまま動くコードに書き直してみた

def quicksort(xs)
  if xs.length <= 1
    xs
  else
    smaller, larger = xs[1..-1].partition { |x| x < xs[0] }

    quicksort(smaller) + [xs[0]] + quicksort(larger)
  end
end
561デフォルトの名無しさん:2013/08/18(日) 00:46:26.95
>>557
真の中央値ってなんだ?
もしかしてソートした配列の中で、
真ん中の値だと思ってる?

xs[Math.floor(xs.length/2)]

どうみても、(ソート関係ない)配列の中で
真ん中に位置する添字の値です。
562デフォルトの名無しさん:2013/08/18(日) 00:47:30.68
>>557
終わってないよ
中央値はO(n)の計算量で求められるし
563デフォルトの名無しさん:2013/08/18(日) 00:48:05.30
>>552
つまり、HaskellやScalaではラムダ式は
文法としてはあるけど実際は使わないから
functionとreturnキーワードをラムダ式に使う
冗長な記述しか認めんって主張をしてるの?
564デフォルトの名無しさん:2013/08/18(日) 00:48:44.95
>>561
だからそれを言ってるのに理解力無いな・・。
565デフォルトの名無しさん:2013/08/18(日) 00:48:54.30
誰だよ、smaller、largerなんて名前をつけたやつw
(※>>529です)

おかげで、>>560がワケの分からないコードを書き始めたぞw
566デフォルトの名無しさん:2013/08/18(日) 00:50:35.04
>>564
お前が誰だかさっぱりわからん。

「真の中央値」と言い出したのは誰で
どういう意味で、なぜそう思ったのかを
いってくれ。
567デフォルトの名無しさん:2013/08/18(日) 00:51:28.41
>>562
それは不勉強だった。すまん。
568デフォルトの名無しさん:2013/08/18(日) 00:58:04.68
>>560
xs[1..-1]
なにこれ
全要素って意味?
569デフォルトの名無しさん:2013/08/18(日) 01:01:36.97
>>568
xs[0] が hd xs で、xs[1..-1] が tl xs
リストの頭部と尾部のこと
570デフォルトの名無しさん:2013/08/18(日) 01:04:10.80
>>569
やるじゃん
後はif文消すだけだな
571デフォルトの名無しさん:2013/08/18(日) 01:07:33.14
ほぼ整列済みのときの移動を減らすためだろ。
572デフォルトの名無しさん:2013/08/18(日) 01:10:27.25
クイックソートのアルゴリズムをちゃんと知ってないので
>>503が書いた
val pivot = xs(xs.length / 2)
が正しいやり方だと思っていた。

別に配列の最初の値でいいのか。

ならもっとスマートに書けるな。
573デフォルトの名無しさん:2013/08/18(日) 01:15:14.81
最初の値でいい。真ん中と平均の処理時間は変わらないはず。
574デフォルトの名無しさん:2013/08/18(日) 01:15:28.36
>>572
クイックソートは、smallerとlargerがほぼ同数になるように
分割すると計算量的に有利なので、
pivotはxsの中で最も中央値に近い値を選ぶのがベスト

だけど、馬鹿正直に中央値を計算するのも無駄が多いので、
適当に三点くらいのサンプルをとって、その中央値をpivotにしたりする、らしいよ
575デフォルトの名無しさん:2013/08/18(日) 01:15:37.11
>>565,572
>>560は、>>506のPrologコードをRubyに書き直したもの
Prologを知らないなら、GHC(KL1)かErlangのコードがWikipewdiaにあるから、それを嫁
 http://ja.wikipedia.org/wiki/Guarded_Horn_Clauses
 http://ja.wikipedia.org/wiki/Erlang

>>503やその他のコードでは中央値としてリストの中央に位置する値を選んでいるが、
これは近似値にすぎない
もし正確な中央値を求めたいのなら、リスト全体を探索しなければならない
そんな無駄をするくらいなら、リストの先頭値(頭部)を中央値と仮定してしまえ!と
いうのがミソになる
また、>>503その他では3回のフイルタでリストを全探索しているが、
これをメソッドArray#partitionの1回で済ませているのも高速化のキモになる
576デフォルトの名無しさん:2013/08/18(日) 01:17:43.53
こうかな。

function quicksort(xs) {
  if (xs.length <= 1) return xs;

  var parts = xs.partition(function(x) { return x < xs[0] });
  return ArrayEx.concat( quicksort(parts[0]), xs[0], quicksort(parts[1]) );
}
577デフォルトの名無しさん:2013/08/18(日) 01:18:13.17
そしてここで実用性のないhaskellコードが

qsort [] = []
qsort (x:xs) = qsi (< x) ++ [x] ++ qsi (x <)
 where qsi func = qsort (filter func xs)
578デフォルトの名無しさん:2013/08/18(日) 01:19:30.25
標準ライブラリ関数が充実していれば、
どんな言語も大差ないんよね。

標準ライブラリ関数が充実してなければ、
自作ライブラリ関数が充実させればいいだけ。
579デフォルトの名無しさん:2013/08/18(日) 01:20:41.46
あ、本当にバグってる
けどいいや
580デフォルトの名無しさん:2013/08/18(日) 01:21:05.04
真ん中あたりの値を使うのは、たまたま
ソート済みの配列を与えられた場合の
処理の無駄を恐れてのことだろ?
581デフォルトの名無しさん:2013/08/18(日) 01:22:48.87
>>580
正解
582デフォルトの名無しさん:2013/08/18(日) 01:23:20.78
別に真ん中あたりの値を使っても
最悪の計算量がO(n^2)になるのは同じよ
583デフォルトの名無しさん:2013/08/18(日) 01:23:52.25
>>577
要素の重複もついでに排除してくれるよいコードですね。
584デフォルトの名無しさん:2013/08/18(日) 01:26:22.36
>>582
経験的に真ん中の値を使う場合の最悪の並びで与えられるより
ソート済みの配列を与えられる可能性の方がはるかに多い。
585デフォルトの名無しさん:2013/08/18(日) 01:27:07.01
再帰が要素と同じ階層になる。
586デフォルトの名無しさん:2013/08/18(日) 01:27:46.60
>>583
こ・・このやろう・・馬鹿にしやがって・・
587デフォルトの名無しさん:2013/08/18(日) 01:28:19.09
>>577
qslの適用を1回で済ませるように書き直せないかな?
588デフォルトの名無しさん:2013/08/18(日) 01:29:26.33
なお、pivotに中央値を使っても平均計算量はO(n log n)で先頭を使ったときと変わらず、
かつ最悪の計算量もO(n log n)になるよ
589デフォルトの名無しさん:2013/08/18(日) 01:29:53.29
>>584
×ソート済みの配列を与えられる可能性の方がはるかに多い。
○ソート済みの配列を与えられる可能性の方が相当多い。



そーとー多い
590デフォルトの名無しさん:2013/08/18(日) 01:30:50.76
もっとも、クイックソートをこのスタイルで書いてる時点で、
効率が云々とかいう議論はナンセンスなんだけどな。
591デフォルトの名無しさん:2013/08/18(日) 01:31:24.93
山田くーん
>>589の座布団ソートして
592デフォルトの名無しさん:2013/08/18(日) 01:31:37.15
真ん中あたりの値を使うのは、
データが連結リストだと遅い
593デフォルトの名無しさん:2013/08/18(日) 01:34:02.88
>>590
それを言ったら、大抵の言語に標準で存在するソート関数を
こんなとこで議論してどうするよ……
594デフォルトの名無しさん:2013/08/18(日) 01:36:23.91
>>586
次からは、たとえ劣等言語であっても、
すでにあるコードをよく読んでから投稿しようね。
595デフォルトの名無しさん:2013/08/18(日) 01:39:14.46
>>593
言語組み込みのソートで
クイックソートなんか普通使わんだろ。
596デフォルトの名無しさん:2013/08/18(日) 01:40:36.61
>>592
効率気にする奴が連結リストなんかソートするな。
597デフォルトの名無しさん:2013/08/18(日) 01:49:42.12
>>587
qsort [] = []
qsort (x:xs) = qsort (fst parted) ++ [x] ++ qsort (snd parted)
 where parted = partition (< x) xs

書いたけど、リストの時点で比較とかの速度気にしても仕方ないと思うよ。
598デフォルトの名無しさん:2013/08/18(日) 01:49:45.64
話を戻すと、そもそも「関数型ハイブリッド言語(キリッ」とか言って
しょぼいクイックソートのコードを貼る>>498のセンスが悪い
599デフォルトの名無しさん:2013/08/18(日) 01:52:11.84
Javascriptのソート。

sort = function (xs) {
return xs.sort();
};
600デフォルトの名無しさん:2013/08/18(日) 01:52:45.56
それに比べたら>>576のJavaScriptコードは
相当シンプルになったよ。

言語じゃないんだよね。
601デフォルトの名無しさん:2013/08/18(日) 01:54:12.02
そうだな
ArrayExは言語機能じゃないな
602デフォルトの名無しさん:2013/08/18(日) 01:56:13.12
そう、ライブラリの力が
開発効率に一番影響する。
603デフォルトの名無しさん:2013/08/18(日) 01:58:13.12
JavaScriptの糞コードを出したらボコボコにされたので
必死に話をそらそうとしているの図
604デフォルトの名無しさん:2013/08/18(日) 01:59:49.14
他言語との比較目的なのに、いいかげん
架空のライブラリー使って書いたコード貼るのやめろよ。
605デフォルトの名無しさん:2013/08/18(日) 01:59:53.74
ArrayExというオレオレライブラリを作るとこうなる(キリッ
606デフォルトの名無しさん:2013/08/18(日) 02:02:27.63
>>598
禿
607デフォルトの名無しさん:2013/08/18(日) 02:03:21.30
でも普通の開発では、足りない部分は
自分でライブラリ作成して補うじゃん?

そのライブラリを作成する機能は
言語の機能じゃん?

現実的な話をしようぜ。
608デフォルトの名無しさん:2013/08/18(日) 02:05:50.67
オレオレライブラリーを後出し拡張すれば、
JavaScriptでもSmalltalk程度の表現が可能なのはわかった。
609デフォルトの名無しさん:2013/08/18(日) 02:09:32.63
>>608
middleって名前あり?
610デフォルトの名無しさん:2013/08/18(日) 02:12:56.67
ありでいいよ。
611デフォルトの名無しさん:2013/08/18(日) 02:22:44.96
middleは配列の真ん中の値を返す
612デフォルトの名無しさん:2013/08/18(日) 02:30:22.30
だめだ。これ以上は無理だ。

function qsort(xs){
 var part = xs.slice(1).reduce(function(pt,e){
  return (e < x ? pt.s : pt.l).push(e) , pt;
 },{l:[],s:[]});

 return !xs.length ? xs : [].concat(
  qsort(part.l),
  [x],
  qsort(part.s)
 );
}

ところで >>498はなんで
.filter(function(x){ pivot == x; })
なんて入れたんだ?
613デフォルトの名無しさん:2013/08/18(日) 02:32:09.94
失礼。コピペミス。

function qsort(xs){
 var part = xs.slice(1).reduce(function(pt,e){
  return (e < xs[0] ? pt.s : pt.l).push(e) , pt;
 },{l:[],s:[]});

 return !xs.length ? xs : [].concat(
  qsort(part.s),
  [xs[0]],
  qsort(part.l)
 );
};
614デフォルトの名無しさん:2013/08/18(日) 02:34:11.51
{1,1,1,1,2,2,2,3,3,3}とか
615デフォルトの名無しさん:2013/08/18(日) 02:40:15.37
>>594
何様だ
616デフォルトの名無しさん:2013/08/18(日) 02:47:09.83
最近のjavascriptには配列にfilterやreduceなんてもんがあるのか
Ieのバージョンでいえば、いつからの話?
617デフォルトの名無しさん:2013/08/18(日) 02:53:43.52
filter メソッド (JavaScript)
必要条件
Internet Explorer 9 標準、Internet Explorer 10 標準の各ドキュメント モードでサポートされます。
Quirks、Internet Explorer 6 標準、Internet Explorer 7 標準、Internet Explorer 8 標準の各ドキュメント モードでサポートされていません。
http://msdn.microsoft.com/ja-jp/library/ie/ff679973(v=vs.94).aspx



Array.filter - JavaScript | MDN
実装されたバージョン JavaScript 1.6 (Gecko 1.8b2 以降)
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
618デフォルトの名無しさん:2013/08/18(日) 02:59:18.57
bind(カリー化)の導入に続きletの導入が検討されてるさなかで
filterすらやっと導入したieは死んでいい
619デフォルトの名無しさん:2013/08/18(日) 04:36:56.34
かなり最近だな
IE9かよ
620デフォルトの名無しさん:2013/08/18(日) 09:32:14.02
即時評価だろ?クソじゃん
遅延評価が可能なまともなイテレータの仕組みを導入してから対応するのが筋だろう
621デフォルトの名無しさん:2013/08/18(日) 10:19:29.39
そうでもないよ
まあ、generatorならFirefoxで対応してるし、次期javascriptでは入るが
622デフォルトの名無しさん:2013/08/18(日) 10:58:32.97
そうでもあるよ
時代遅れのウンコすぎ
623デフォルトの名無しさん:2013/08/18(日) 11:01:30.80
Coffeeのリスト内包表記もPythonと違ってジェネレータにできないから所詮サンプルコード専用の飾り
624デフォルトの名無しさん:2013/08/18(日) 12:11:46.14
それが致命的だと思ってるのはお前だけじゃね?
そんなに致命的ならCとかですぐにジェネレーターができたはずだろ
まあ、イテレータパターンくらいならどの言語でも普通にライブラリがあるけど
大抵for文で間に合ってるからほとんど使われないねw
パフォーマンスなんて結局そんなもんなんだよ
625デフォルトの名無しさん:2013/08/18(日) 12:26:15.92
普通にforループ回すスタイルなら無くても良いよ、確かに

でも、mapやfilterなどの関数を合成するスタイルのプログラミングをするなら、
遅延評価は欲しいよ
関数合成するたびに中間状態でリスト作られるのは、いくら何でも無駄すぎる


まあ「関数型ハイブリッド言語」なら在った方が良いんじゃないのw
626デフォルトの名無しさん:2013/08/18(日) 12:27:11.53
>>560>>597を参考にした、SML(Standard ML)のクイックソート

fun
  qsort [] = []
|
  qsort (x::xs) = let
    val (smaller, larger) = List.partition (fn e => e < x) xs
  in
    List.concat [qsort smaller, [x], qsort larger]
  end
627デフォルトの名無しさん:2013/08/18(日) 12:35:59.07
>>623
そういえば、ここまでPythonのコードが見あたらないね
628デフォルトの名無しさん:2013/08/18(日) 12:40:33.14
どうして関数型言語陣営は
重複を考慮しないコードを書きたがるの?
ただのバカなの?
629デフォルトの名無しさん:2013/08/18(日) 12:57:24.69
>>623
重複を考慮しない、とはどういう意味?
入力リスト内で要素に重複があっても正しくソートできるけど....

- qsort [3,6,1,2,1,5,4,3];
> val it = [1, 1, 2, 3, 3, 4, 5, 6] : int list
630デフォルトの名無しさん:2013/08/18(日) 12:59:41.09
アンカをミスった
>>629>>623は間違いで、>>628が正しい
631デフォルトの名無しさん:2013/08/18(日) 13:11:13.60
>>625
どうかなあ、実際リストがそれほど大きいなら関数型スタイル
つかわないでforにするでしょ
ほとんどは1000以下の速度とかどうでもいいリストだろ
ブラウザ画面で1000も表示してたら通信速度もレスポンスも悪い
632デフォルトの名無しさん:2013/08/18(日) 13:22:05.60
>>628
おそらく、たまたま>>577のHaskellコードが重複を考慮していなかった(>>583)ので、
すべての関数型スタイルが重複を考慮していない、と(>>628は)早合点したんだろなw

フィルタ(filter)を止めて、リストを二分割するパーティション(partition)という
述語(>>506)、メソッド(>>560)、関数(>>597,626)を導入したことで、
フィルタの抱えていた重複問題が自然に解決できた、という訳だ
しかもリスト探索が1回で済むから効率も改善された
633デフォルトの名無しさん:2013/08/18(日) 13:49:44.35
>>627
Python (with numpy)


qsort = lambda xs: xs if xs.size <= 1 else numpy.concatenate(
        (qsort(xs[xs < xs[0]]), xs[xs==xs[0]], qsort(xs[xs > xs[0]])))
634デフォルトの名無しさん:2013/08/18(日) 13:55:53.85
>>618
どうせブラウザの生存期間はもっと長いので、
polyfillで未対応ブラウザでも
容易に対応できるものはあまり問題視しない。
635デフォルトの名無しさん:2013/08/18(日) 14:11:22.05
>>633
他の言語と同様に、標準ライブラリだけで書けないかな?
636デフォルトの名無しさん:2013/08/18(日) 14:16:10.94
>>635

def qsort(xs):
    if len(xs) <= 1:
        return xs
    ss = [x for x in xs[1:] if x < xs[0]]
    ls = [x for x in xs[1:] if x >= xs[0]]
    return qsort(ss) + xs[:1] + qsort(ls)
637デフォルトの名無しさん:2013/08/18(日) 14:18:07.33
>>633
xs[xs < xs[0]] ってどう解釈されるの?
638デフォルトの名無しさん:2013/08/18(日) 14:23:43.79
>>636
他の言語(>>506,560,597,626)と同様に、
1回のqsort呼び出しでリスト要素の全探索処理が1回ですむように書けないかな?
639デフォルトの名無しさん:2013/08/18(日) 14:27:40.61
どんなサンドバッグだよ
640デフォルトの名無しさん:2013/08/18(日) 14:29:26.73
>>637
[x for x in xs if x < xs[0]]


>>638
>>636のssとlsの生成を以下に置き換え

ss, ls = reduce(lambda (xss), x: (xss, xss[0 if x < xs[0] else 1].append(x))[0], xs[1:], ([],[]))
641デフォルトの名無しさん:2013/08/18(日) 14:33:38.38
クイックソートの再帰に関する部分が常に一度きりだったら、それはクイックソートでないだろ。
642デフォルトの名無しさん:2013/08/18(日) 14:37:02.60
いやだからね、
array.sort();
で終わる話をいつまで続けてるんだって話なんですよ
言語の違いはライブラリの違い
ぶっちゃけほとんどそれだけ
643デフォルトの名無しさん:2013/08/18(日) 14:38:21.67
>>628
関数型陣営と限定してるけど
実は関数型もスクリプトも両方書いてるというオチ
644デフォルトの名無しさん:2013/08/18(日) 14:39:38.07
>>640
置き換えてみた

def qsort(xs):
&#xA0;&#xA0;&#xA0;&#xA0;if len(xs) <= 1:
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;return xs
&#xA0;&#xA0;&#xA0;&#xA0;ss, ls = reduce(lambda (xss), x: (xss, xss[0 if x < xs[0] else 1].append(x))[0], xs[1:], ([],[]))
&#xA0;&#xA0;&#xA0;&#xA0;return qsort(ss) + xs[:1] + qsort(ls)
645デフォルトの名無しさん:2013/08/18(日) 14:40:32.14
読めぬ……
646デフォルトの名無しさん:2013/08/18(日) 14:41:50.27
>>644はコピペに失敗したのでやり直し

def qsort(xs):
  if len(xs) <= 1:
    return xs
  ss, ls = reduce(lambda (xss), x: (xss, xss[0 if x < xs[0] else 1].append(x))[0], xs[1:], ([],[]))
  return qsort(ss) + xs[:1] + qsort(ls)
647デフォルトの名無しさん:2013/08/18(日) 14:44:20.37
>>646
これって>>613と同じ方式?
648デフォルトの名無しさん:2013/08/18(日) 14:58:34.85
>>642
清々しいまでにドカタだな
649デフォルトの名無しさん:2013/08/18(日) 15:04:07.19
>>640
1行が長すぎて読みづらいんだけど、Pythonは可読性を大切にする言語なんだし、
関数内関数が定義できるという利点を活かして、関数partitionの定義/適用で
書き直しできないかな?

あるいは(>>613みたいに)、適切なインデントで可読性を向上させてもいいと思うよ
650デフォルトの名無しさん:2013/08/18(日) 15:09:32.30
f = lambda xss, x: (xss, xss[0 if x < xs[0] else 1].append(x))[0]
ss, ls = reduce(f, xs[1:], ([],[]))
651デフォルトの名無しさん:2013/08/18(日) 15:23:10.16
これでわかったけど
次回からPHPやPerlは消していい
652デフォルトの名無しさん:2013/08/18(日) 15:24:04.18
>>642の「言語の違いはライブラリの違い」という意見も一理あると思うので、
>>560のRubyコードにいついて、組込みメソッド Enumerable#partition を利用せず
ユーザ定義メソッドとして書き直してみた

def quicksort2(xs)
  partition = -> array, fn {
    array.inject([[], []]) { |(xs, ys), elem|
      fn[elem] ? [xs << elem, ys] : [xs, ys << elem]
    }
  }

  if xs.length <= 1
    xs
  else
    smaller, larger = partition[xs[1..-1], -> x { x < xs[0] }]

    quicksort(smaller) + [xs[0]] + quicksort(larger)
  end
end
653デフォルトの名無しさん:2013/08/18(日) 15:25:50.46
>>651
関数型プログラミングがスクリプト言語のすべてではないから、消す必要はないと思う
654デフォルトの名無しさん:2013/08/18(日) 15:27:35.76
クイックそーとなんてどうでも良いんだから
そんなんでPerlとPHPを削られてもな……
655デフォルトの名無しさん:2013/08/18(日) 15:28:18.93
今はPHPもPerlも関数型の書き方で書けるはずなのに
書かないという事は人数がいない
656デフォルトの名無しさん:2013/08/18(日) 15:37:07.57
まあ、Perlで書こうと思えば書けるけど、
なんかJS厨っぽい奴に粘着されそうでメンドイわ
657デフォルトの名無しさん:2013/08/18(日) 15:37:53.57
無理にラムダ式を使っていた>>652が読みづらかったので、
素直に普通のメソッド定義で書き直した

def partition(array, &fn)
  array.inject([[], []]) { |(xs, ys), e|
    fn[e] ? [xs << e, ys] : [xs, ys << e]
  }
end

def quicksort3(xs)
  if xs.length <= 1
    xs
  else
    smaller, larger = partition(xs[1..-1]) { |x| x < xs[0] }

    quicksort(smaller) + [xs[0]] + quicksort(larger)
  end
end
658デフォルトの名無しさん:2013/08/18(日) 15:39:12.28
>>657
バトルスレなんだから、それは不戦敗と等しいのでは?
659デフォルトの名無しさん:2013/08/18(日) 15:43:25.10
>>656
ああ、うん・・それは同意。
660デフォルトの名無しさん:2013/08/18(日) 15:57:28.01
何回も呼ぶ関数の中で関数内定義するのはやだなあ
partition とかよく使う処理だし外でいいよ
661デフォルトの名無しさん:2013/08/18(日) 16:07:58.18
馬鹿みたいにリストを作りまくってるのに
今更何言ってんだって話だけどな
662デフォルトの名無しさん:2013/08/18(日) 16:09:25.24
クイックソートみたいな処理を何度も呼ぶという感覚がそもそも
おかしいので、まずその辺の教養をつけるといい
土方作業でも何でもいいから
663デフォルトの名無しさん:2013/08/18(日) 16:17:06.66
クイックソートは再帰関数なんだから
何度も呼ばれるに決まってんだろ
ドカタはドカタらしくすっこんでろ
664デフォルトの名無しさん:2013/08/18(日) 16:26:08.62
>>661
Rubyのメソッド Array#<< は破壊的操作だよ
>>657だと、メソッド inject の引数で配列が2個生成されて、
それらにメソッド << で要素を(破壊的に)追加している
だから、inject内のループで毎回ソート対象の配列全体を再生成している訳ではない
(ただしタプルとして使う2要素の配列は毎回生成してるけどね)
665デフォルトの名無しさん:2013/08/18(日) 16:32:21.77
>>657について、partitionの定義本体部分をクイックソート関数内で展開してみた
結局のところ、元の>>560と比べて2ステップ増えただけという、つまらん結果になった

def quicksort4(array)
  if array.length <= 1
    array
  else
    smaller, larger = array[1..-1].inject([[], []]) { |(xs, ys), e|
      e < array[0] ? [xs << e, ys] : [xs, ys << e]
    }

    quicksort(smaller) + [array[0]] + quicksort(larger)
  end
end
666デフォルトの名無しさん:2013/08/18(日) 16:33:12.79
>>664
Rubyは配列への要素の追加操作で
内部的な配列再生成は伴わないの?
どうやってメモリを確保しているんだろう。
667デフォルトの名無しさん:2013/08/18(日) 16:38:33.35
>>663
まずは計算量という言葉を学習してから来い
668デフォルトの名無しさん:2013/08/18(日) 16:39:56.03
>>667
まさか、このスレのコードが空間計算量をまともに考えているとでも?
669デフォルトの名無しさん:2013/08/18(日) 16:46:24.86
>>666
Rubyの配列は、内部実装としては双方向ポインタによる連想リストだから、
追加(<<)の場合には、追加した要素の分だけしかメモリは確保されない
670デフォルトの名無しさん:2013/08/18(日) 16:49:15.58
スクリプト言語の実装は良く分からんけど、関数ってCだとコード領域に
一つだけ定義されてて、全部アドレス呼び出しに変換されてるよな
スクリプト言語だと、まさかいくつも関数の領域を同的に確保して、
時間食ったりするの?
671デフォルトの名無しさん:2013/08/18(日) 16:50:45.19
> quicksort(smaller) + [xs[0]] + quicksort(larger)

無駄にリスト作りまくりなのはpartitionじゃなくて、ここ
672デフォルトの名無しさん:2013/08/18(日) 16:51:13.43
>>667は空気が読めない人
673デフォルトの名無しさん:2013/08/18(日) 16:52:03.51
>>670
言語や実装によるとしか。
674デフォルトの名無しさん:2013/08/18(日) 16:54:18.11
>>670
スクリプト言語の関数はクロージャになってるのが多いし、
クロージャは環境も含むから、それぞれ毎に領域を確保する必要はあるだろう
ただ、毎回パースしたりするわけじゃない
675デフォルトの名無しさん:2013/08/18(日) 17:24:39.65
Google Chromeのjsだと感覚通り。
http://jsperf.com/generating-simple-closure-test
676デフォルトの名無しさん:2013/08/18(日) 17:29:48.42
>>675
一番遅いやつでも一秒間に200万回、、、
こんなの気にしてるやつがバカだなw
677デフォルトの名無しさん:2013/08/18(日) 17:33:17.57
>>676
どう受け取ったらそうなるんだよ
678デフォルトの名無しさん:2013/08/18(日) 17:33:49.68
クロージャって言っても静的スコープだから
スコープチェーンみたいなものへの
ポインタがあるだけでしょ
679デフォルトの名無しさん:2013/08/18(日) 17:35:26.84
>>677
素直に数字見たらそうなるだけだが?
どれも速すぎて全く処理がないと考えていい
680デフォルトの名無しさん:2013/08/18(日) 17:48:14.76
初代Pentium 300MHzが理論値300MFLOPSで、浮動小数点演算を秒間300万回できた
それを速すぎると感じた時代もあったね
681デフォルトの名無しさん:2013/08/18(日) 18:08:24.82
うまいたとえ話をしたつもりかもわからんが、
関数定義の処理は、時代が進んだらハードも当然変わるんだが
682デフォルトの名無しさん:2013/08/18(日) 18:08:26.15
>>688からわかることは、浮動小数点演算が速いと
思われた当時より数年たった今、ますます速いと
思っているように、CPUの進化でどんどん速くなる。

一秒間に200万回。これは今は速い程度だが、
将来は超速い処理ということになるだろう。
つまりますます気にしなくて良くなる。

このことを>>688はいいたいのだろう。
683デフォルトの名無しさん:2013/08/18(日) 18:12:16.21
>>498のコードを真面目に比較して書いて5%程度の差。
誤差としていいかもしれんが、全く処理がないはいくらなんでも言い過ぎ。
684デフォルトの名無しさん:2013/08/18(日) 18:14:43.49
ベンチマークを過信するとそうなるよね。
あるものに比べて5倍の速度が出ましたとかね。
実際使ってみると5倍も差があるように感じない。

その理由は二つあって、

一つは、プログラム全体の処理時間のうちわずか1%の部分が5倍速くなっただけ。
ベンチマークではわずか1%の部分だけを集中して
計測するようなことをするから5倍さがでるがプログラム全体からすれば
体感できないレベル。

もう一つは、もともと速い処理がもっと速くなっただけ。
0.001秒で終わるものが、0.0001秒で終わっても計測は出来るだろうが
人間にはわからない。

具体的なアプリで何秒の差がでたかというのが人間にとっては重要。
685デフォルトの名無しさん:2013/08/18(日) 18:16:32.17
また煙に巻き始めた
686デフォルトの名無しさん:2013/08/18(日) 18:23:18.40
煙に巻かれた。の間違いじゃないのか?
687デフォルトの名無しさん:2013/08/18(日) 18:26:00.00
また一般論で不毛な議論に持って行こうとしてるんだから間違ってない。
何のために話題用意してると思ってるんだよ低能。
688デフォルトの名無しさん:2013/08/18(日) 18:40:33.89
>>685
やっぱもっと宗教的・哲学的・美学的観点から論議したほうがはっきりしていいよね
689デフォルトの名無しさん:2013/08/18(日) 18:46:22.43
683は一体どんなベンチマークをして5%差などと言ってるんだ?
それを言わないことには何の価値もないぞ
690デフォルトの名無しさん:2013/08/18(日) 18:53:01.86
関数型クイックソート実装はもうあきたから次のお題はよ
691デフォルトの名無しさん:2013/08/18(日) 18:53:04.15
そりゃwebやってるドカタからみれば
秒間200万なんて異次元の速度なんだろうな
692デフォルトの名無しさん:2013/08/18(日) 18:59:30.26
結局、捨て台詞はいて終わりか
693デフォルトの名無しさん:2013/08/18(日) 19:04:12.60
他言語の比較もしろっつってのに
自己顕示欲満たすために議論してる奴は死ね
694デフォルトの名無しさん:2013/08/18(日) 19:04:12.79
速度が十分かどうかなんてアプリケーションによって違う
695デフォルトの名無しさん:2013/08/18(日) 19:06:02.81
JS厨ってマイクロベンチなんて意味無いって言いながら
JSのJITは速いって事ある毎に言ってて面白い
696デフォルトの名無しさん:2013/08/18(日) 19:07:10.92
だからマイクロベンチが意味なくって
JITが速いのは意味があることでしょ?

何を言ってるんだろうかね。
697デフォルトの名無しさん:2013/08/18(日) 19:09:49.07
JITが速いってマイクロベンチで比較した結果でしょ?
698デフォルトの名無しさん:2013/08/18(日) 19:13:27.63
マイクロベンチマークで比較するのが意味ないではなくて、
秒間200万回とか300万回が十分速いとかいう話じゃないのか?
699デフォルトの名無しさん:2013/08/18(日) 19:20:38.87
ま、数値計算なら遅すぎる
700デフォルトの名無しさん:2013/08/18(日) 19:26:26.90
もうソートは飽きたから>>409に話戻そうぜ
701デフォルトの名無しさん:2013/08/18(日) 19:35:01.47
>>699
つか、ベンチマークの内容をみたところランダムの数値を
作ってる処理が大部分のようだが
702デフォルトの名無しさん:2013/08/18(日) 19:45:01.12
>>409に戻すくらいならソートとか速度の話でいい
703デフォルトの名無しさん:2013/08/18(日) 19:57:36.81
>>701
え?
704デフォルトの名無しさん:2013/08/18(日) 20:04:57.47
>>680
初代 Pentium の 300MHz なんてあるんだ。
200MHz までだと思ってた。
705デフォルトの名無しさん:2013/08/18(日) 20:40:27.73
>>703
マジでマジで
return functionのとこなんか特に
Random生成なんて線形合同法のバリエーションか似たような速度の
アルゴリズムだろ
つまり、実質のコストは数値一回足したとか二回演算したとかそんなもん
706デフォルトの名無しさん:2013/08/18(日) 20:52:25.35
乱数生成は秒間2400万回くらい実行できてるみたいですがねぇ……
707367:2013/08/18(日) 20:52:39.31
しばらくクイックソートの議論が続いていたので自制していましたが、
要望があったので再開します

ここまでの指摘について、>>409を更新しました

FP
 ---- 壁0. 変数の壁 ----
Haskell
 ---- 壁1. 純粋性(副作用)の壁 ----
F#/OCaml/SML/Scala
 ---- 壁2. 型推論の壁 ----
=====<< 越えられない壁 >>=====
Erlang
 ---- 壁3. パターンマッチの壁 ----
Common Lisp/Scheme/Ruby1.9
 ---- 壁4. 末尾再帰最適化の壁 ----
Emacs-lisp/Closure/Smalltalk/Ruby1.8
 ---- 壁5. 式指向(条件判定式)の壁 ----
=====<< 越えられない壁 >>=====
C++/Java/C#/Perl/Python...etc
 ---- 壁6. ラムダ式の壁 ----
C

[変更点]
・Common Lisp を上げ、Emacs-lisp を新規に追加 -- >>444,450,459
・壁3.を新規に変更 -- >>455,456
・壁.「クロージャ/ラムダ式」を「ラムダ式」に変更し、これに伴って
 C++/Java/C#/Perl/Python についてバージョン化も廃止
  ==> これについては、別途説明します

・「壁5.式指向」について、>>480以降で客観的な意見(反論/異論)が無かったので保留
・Ruby1.9の末尾再帰最適化について、実装が不完全であるという確定情報が無いので保留(>>490)
708デフォルトの名無しさん:2013/08/18(日) 20:53:47.32
環境によって違う数値を比べられてもねえ
自分の数値でどれだけ遅くなってるのかを言ってもらわないと
709デフォルトの名無しさん:2013/08/18(日) 20:55:18.01
>>705
randomは全ケースで同じ数だけ呼び出してる
710デフォルトの名無しさん:2013/08/18(日) 20:55:32.80
その一番上にあるFPとかいう言語はなんなん?
711デフォルトの名無しさん:2013/08/18(日) 20:56:04.40
>>709
で?
712デフォルトの名無しさん:2013/08/18(日) 20:58:21.20
誰だよこいつ呼んだ馬鹿・・
713デフォルトの名無しさん:2013/08/18(日) 20:58:37.24
>>711
>>706なんだから、randomが処理の大部分を占めるわけがない
714デフォルトの名無しさん:2013/08/18(日) 21:00:10.69
>>711
で?って言われても
コード見る限りその上での比較だから最低でも乱数生成より2倍は遅い
715デフォルトの名無しさん:2013/08/18(日) 21:02:22.49
他のクロージャ生成のベンチ作ろうぜ
716デフォルトの名無しさん:2013/08/18(日) 21:02:37.09
>>713
706なんて他の数値を公表してないから何とも言えん
717デフォルトの名無しさん:2013/08/18(日) 21:04:28.36
>>714
俺の環境だと、一番遅いやつで乱数生成の3倍程度
一番早いやつだと1/2だから、乱数生成が大多数を占めてる
特にクイックソートのやつはこれだろ
718367:2013/08/18(日) 21:11:13.81
>>710
Fortranの設計者でありBNF(バッカスナウア記法)の考案者でもある
バッカス氏が考案した関数型言語です
特徴としては変数という概念が存在せず、プログラム構成子と呼ばれる
高階関数を使い、アトム、基本関数(=組み込み関数)、そして
プログラム構成子自身を組み合わせることでプログラミングを進めます

Wkipediaの英語版にも解説があるので、そちらも参考になるでしょう
http://en.wikipedia.org/wiki/FP_(programming_language)

日本語では、以下の書籍で解説されています
・続 新しいプログラミング・パラダイム
 http://www.amazon.co.jp/dp/4320025350/
なお、この書籍は>>575で紹介したGHCや、演繹データベース、
圏論のコンパイラ生成への応用、もう一つの「究極のプログラミング」である
構成的プログラミングなど、興味深いトピックが満載なのでお薦めです
719デフォルトの名無しさん:2013/08/18(日) 21:13:39.74
>>717
一番速いやつってJust Return Fixed Functionってヤツ?
これは関数返してるだけで関数内関数を作ってないから違くね?
720デフォルトの名無しさん:2013/08/18(日) 21:18:45.77
>>719
作ってるけど、実際の処理は関数内関数を返すだけだから同じじゃね?
まあ正確なところは実際にやってみないと分からんけど
721675:2013/08/18(日) 21:20:04.28
他に試しましたが、結局元のコードが一番対比しやすそうなので戻しました。
http://jsperf.com/generating-simple-closure-test

他の結果が消えてしまったのは一度変更したためです。
722デフォルトの名無しさん:2013/08/18(日) 21:26:06.00
>>700
お前、ほんっとバカだなっ

つーか、自演か?
723367:2013/08/18(日) 21:27:01.43
>>707
>・Ruby1.9の末尾再帰最適化について、実装が不完全であるという確定情報が無いので保留(>>490)

この件について、>>369でも書いているように、情報が確定していません
もし不完全であるという確定情報があれば喜んでRuby1.9を下げたいので、情報提供を歓迎します
724デフォルトの名無しさん:2013/08/18(日) 21:28:45.77
>>723
デフォルトオフの時点でさっさと下げるべきだろう?
725675:2013/08/18(日) 21:31:12.32
PythonはデフォルトONでif式もクロージャもあるけど
なぜか上に上げてくれないようです
そういうこと
726デフォルトの名無しさん:2013/08/18(日) 21:31:50.93
やっばwやっちまったぜ
727デフォルトの名無しさん:2013/08/18(日) 21:32:28.32
>>720
ベンチに関数内関数を作ってるGenerate Function Returns 0ってのがあるので、
それを見ればいいよ
728デフォルトの名無しさん:2013/08/18(日) 21:34:04.19
>>726
ヤバいRuby厨を起こしたのお前か!
729デフォルトの名無しさん:2013/08/18(日) 21:37:57.35
>>726
猛省しる!
730367:2013/08/18(日) 21:44:02.96
>>724
Ruby1.9で末尾再帰最適化が実装されたのは事実ですので、却下します
ただし、その実装が不完全であるという確定情報があれば採用する、という話です

>>725
もしPyhtonの if式が、他の言語と同様に if <cond>: <true> else <false> という
自然な構文に変更されたなら、式指向であると認めます
この件は過去にも何度か議論されていますが、客観的な意見が無いまま、
言い換えるとPyhton支持者の独りよがりな意見のまま議論を終えているのが実情です

また、クロージャについては(自分の不勉強もあって)議論に混乱が見られたので
思いきって>>707では壁から外しましたから、Pyhtonだけが不利では無いと考えます
731デフォルトの名無しさん:2013/08/18(日) 21:46:23.32
>>727
それだと、乱数生成コストとほぼ同じ
結局、関数の中に関数作るのなんて演算数回と変らんってこと
つまり、気にする奴はやはりバカ
732デフォルトの名無しさん:2013/08/18(日) 21:54:09.96
>>730
> もしPyhtonの if式が、他の言語と同様に if <cond>: <true> else <false> という
> 自然な構文に変更されたなら、式指向であると認めます

だからよ、自然な構文かどうかを決めてるのはお前の主観だけだろ?
なーにが「客観的な意見が無いまま」だ、アホ
733デフォルトの名無しさん:2013/08/18(日) 21:55:35.78
客観的っていうなら、式で条件分岐できるか否かだけで判定しろよ
それ以外は主観だろ
734デフォルトの名無しさん:2013/08/18(日) 22:02:21.20
ん?ちょっと待て、pythonのif文は違うのか?
735デフォルトの名無しさん:2013/08/18(日) 22:05:41.54
>>730
> 実装が不完全であるという確定情報

Ruby開発者会議20130727Japan
「特殊なケースでtail call optimizationが効かないことがあってもよいか」
https://docs.google.com/document/d/1Ie6HNoxCptIUe52I3XCxDLn52FtE_RWaF8lrDIXAVmc
736デフォルトの名無しさん:2013/08/18(日) 22:11:00.73
これなに?

367の無知・主観によってなされた不当なランク付けを
いちいち指摘してたり、情報提供してお伺いをたてて
壁を外させたりランクを上げてもらったりするのを
この後もえんえんと続けるの?

あほらし
737デフォルトの名無しさん:2013/08/18(日) 22:12:11.59
くだらんソートコードを書き比べているほうがまだマシだわ
738367:2013/08/18(日) 22:30:12.74
>>372
条件分岐式として不可解な構文を採用しているのはPythonだけ、これが客観性の根拠だよ
不満があれば、過去の議論の一部である以下のカキコへ反論してくれ

====【Perl,PHP】LLバトルロワイヤル19【Ruby,Python】====
711 名前: 682 Mail: sage 投稿日: 2011/12/29(木) 15:05:28.17
>>695のPythonコードが読みづらい原因はif演算子の構文にある
条件判定が式である言語に限定して、それらの構文を比較してみる

Ruby:
  if 条件式 then 式1 else 式2 end
Smalltalk:
  条件式 ifTrue: [ 式1 ] ifFalse: [ 式2 ]
Lisp:
  ( if 条件式 式1 式2 )
ML:
  if 条件式 then 式1 else 式2
Haskell:
  if 条件式 then 式1 else 式2

Python:
  式1 if 条件式 else 式2

普通の言語は「条件式 -> 式1 -> 式2」と左から右へ流れる(それが自然)
それに対して「Pythonだけ」は「式1 <- 条件式 -> 式2」と
左へ右へと行ったり来たりしないとコードが読めない

プログラミング言語界の中で「Pythonだけ」が異端な存在で、可読性の悪い構文が採用されている
これは明らかにPython開発陣の言語設計ミス、あるいは判断ミスだね
739デフォルトの名無しさん:2013/08/18(日) 22:32:04.81
は?構文がどうとか、条件分岐式を持つか否かと関係あんの?
740デフォルトの名無しさん:2013/08/18(日) 22:34:13.38
> (それが自然)


でたよ、主観
741367:2013/08/18(日) 22:35:48.27
>>738の先頭にあるアンカーを間違えていたので訂正する

X: >>372
O: >>732-734
742デフォルトの名無しさん:2013/08/18(日) 22:38:47.77
Pythonってそんなにダサかったんだ
743デフォルトの名無しさん:2013/08/18(日) 22:41:16.77
じゃあ、Rubyにはif修飾子が構文にあるし
これはよく使われてるからランク下げないとな
744367:2013/08/18(日) 22:46:18.74
>>739
>>730の繰り返しになるけど、if-else構文はプログラム言語の基本要素なのだから、
もしPython設計者がPythonを式指向な言語としたのなら、他の式指向言語と同様に
最初から if <cond>: <true> else <false> という構文を採用していた、という話だよ


>>740
それが自然でないなら、>>738にある言語の中でPythonを除く:

 Smalltalk/Lisp/ML/Haskell

の設計者達も(自分と同じく)頭が変なんでしょうね
さて、Pythonのif式が不自然ではないという主張と、どちらが客観性があるのでせうか(棒
745デフォルトの名無しさん:2013/08/18(日) 22:48:11.28
Haskell: \x -> x
OCaml: fun x -> x
SML: fn x => x
Scala: (x:Int) => x
Ruby: -> x {x}

どの関数型言語も、ラムダは「引数 矢印 戻値」と並ぶ(それが自然)
それに対して、Rubyだけが「矢印 引数 戻値」と並んでる
矢印が真ん中だから、引数が戻値に変換されるという意図が伝わるのに、
「Rubyだけ」が異端な構文を採用してる
これは明らかにRuby開発陣の言語設計ミス、あるいは判断ミスだね

異端な構文を採用してると、その言語機能を持っていないルールですので、
Rubyはラムダを持ってないということになりました
746デフォルトの名無しさん:2013/08/18(日) 22:51:37.87
Pythonのも、
Rubyの「式 if 条件」の形に else 節を
付け足したものだと考えれば、
俺は別に変だとは思わないけどな。
Pythonは else 節をよく活用している
面白い機構も多いからなおさら自然な流れだ。
あくまで主観だけどな。w
747367:2013/08/18(日) 22:53:03.00
>>743
三項演算子の話と同じく「樹を見て森を見ず」だね
プログラム言語の基本である if-else 構文がRubyでは式として定義されているから、
(三項演算子と同様に)オマケであるif修飾子の存在は評価基準からは除外できるよ
748デフォルトの名無しさん:2013/08/18(日) 22:55:44.80
ここまでの指摘にもとづいて、>>707を更新しました

FP
 ---- 壁0. 変数の壁 ----
Haskell
 ---- 壁1. 純粋性(副作用)の壁 ----
F#/OCaml/SML/Scala
 ---- 壁2. 型推論の壁 ----
=====<< 越えられない壁 >>=====
Erlang
 ---- 壁3. パターンマッチの壁 ----
Common Lisp/Scheme
 ---- 壁4. 末尾再帰最適化の壁 ----
Emacs-lisp/Closure/Smalltalk
 ---- 壁5. 式指向(条件判定式)の壁 ----
=====<< 越えられない壁 >>=====
C++/Java/C#/Perl/Python...etc
 ---- 壁6. ラムダ式の壁 ----
C/Ruby
749デフォルトの名無しさん:2013/08/18(日) 22:57:54.36
>>747
評価基準から除外できるとか、お前に決める権利はないだろ?
ルールマスターのつもりか?

公平に振る舞いたかったら、せめて「除外できると思うのですが、皆さんどう思いますか?」と訊け
750デフォルトの名無しさん:2013/08/18(日) 23:02:00.35
>>747
あのさあ、
「ある言語が関数型プログラミングに活用可能な機能をどの程度有するか」と
「その言語がどのくらい関数型を意識して設計されたか」をごっちゃに
していないか?

その言語にあったパラダイムがあるんだから、
ここで後者を議論したってしょうがないだろう?
前者なら、条件分岐が値を返せればそれでいいじゃん。
構文の自然さとか、お前の主観は関係ないだろ。

それとも関数型を意識せず設計された言語は存在価値無し!とか思ってんの?
751デフォルトの名無しさん:2013/08/18(日) 23:02:10.30
真面目に相手できるお前がすごい
752367:2013/08/18(日) 23:06:53.93
>>745
Rubyの -> x { c } という構文は、Ruby2.0から採用されているね
これが違和感のある構文だというのは、自分も認める
この -> は、矢印ではなくてギリシャ文字のラムダを横に倒したものらしいが、
正直言ってコジツケだし、写像関係の矢印とまぎらわしい
素直にOCamlまたはSMLの構文を導入すれば良かったと思うが、
おそらくは fun や fn といったキーワードの導入に抵抗があったのだと憶測する

ただし、以前の(そして、Ruby2.0でも廃止されていない)構文は
lambda { |x| x } であれば矢印は使わず、lambdaという見間違えようのないキーワードが
採用されているから、これをラムダ式と見なさないという判断にも無理があるのではないかと
753デフォルトの名無しさん:2013/08/18(日) 23:08:28.16
いや、無理があるとか無いとか、決めるのお前じゃないから
754デフォルトの名無しさん:2013/08/18(日) 23:10:19.05
>>752
であれば |X| というブロック引数の違和感、わかりにくさは無視か?
755デフォルトの名無しさん:2013/08/18(日) 23:14:18.02
>>752
とにかく、お前が「認める」「認めない」とかいう判断を必要とする
時点で、それはお前の主観に塗れた排除されるべき要素なんだよ。
相手には客観性を求めるくせに、いいかげんアンバランスに気付けよ。
756デフォルトの名無しさん:2013/08/18(日) 23:14:53.04
確かにブロック引数は違和感あるな
757デフォルトの名無しさん:2013/08/18(日) 23:16:11.65
367に絡んでるだけで自分の意見が何もないやつのほうが邪魔なんだよ
758367:2013/08/18(日) 23:18:02.31
>>746
Rubyの関数型プログラミングではif修飾子は無視できる、ってことだよ
逆に、Pythonの自然な構文 if <cond>: <true> else <false> は、
Pythonの関数型プログラミングでは使えないので不自然なif式を使わざるをえない

これは、クイックソートのコード合戦で、明らかになったのではないかな?
759デフォルトの名無しさん:2013/08/18(日) 23:19:03.08
おまえがいちばん邪魔
760デフォルトの名無しさん:2013/08/18(日) 23:19:03.68
> これは、クイックソートのコード合戦で、明らかになったのではないかな?

まーた釣り臭い書き込みを……
上手いなーw
761367:2013/08/18(日) 23:24:57.41
>>750
>それとも関数型を意識せず設計された言語は存在価値無し!とか思ってんの?

いや、>>653は自分のカキコだけど、なにか?
>>367の冒頭で書いたように、この議論は「関数型プログラミングの適性」という
限られた条件下での比較だから、誤解は勘弁願いたい
762デフォルトの名無しさん:2013/08/18(日) 23:27:21.55
>>761
そのわりに、構文のセンスとか設計までさかのぼって議論しているじゃん。
明らかにおかしいよ。
763デフォルトの名無しさん:2013/08/18(日) 23:28:03.60
なんだ? もう次スレの話か?

立てておいたぞ。

【PHP,Python】スクリプト,バトルロワイヤル37【Perl,Ruby,JS】
http://toro.2ch.net/test/read.cgi/tech/1376836047/
764デフォルトの名無しさん:2013/08/18(日) 23:34:08.88
>>758
どう明らかになったのか知らんので、説明頼む
Pythonのif式ではクイックソートが書けなかったんだっけ?
765デフォルトの名無しさん:2013/08/18(日) 23:34:40.26
何が自然で何が不自然か
何が読みやすくて読みにくいか
これは考え方次第なんじゃね?

例えばCOBOLが自然言語に近いから
わかりやすいという主張があった。
これはある意味間違ってはないと思う。

違いは、数式で表現するか文章で表現するかだよ。
数式で表現すれば簡潔に書け、数式を知っている者にとってはわかりやすいが
知らない者にとってはわかりにくい。
文章だと数式を知らなくてもわかるが、少し文字が多くなる。

どちらがわかりやすいかというのは
場合によりけり。

俺は、なんでも短くかければいいとは思わないな。
766367:2013/08/18(日) 23:35:33.84
>>752
ナリスマシかよw

>>754
樹を見て森を見ず
767デフォルトの名無しさん:2013/08/18(日) 23:37:28.89
括弧が省略できれば見やすいか?と聞かれれば、
省略しないほうが見やすい場合もある。
セミコロンも同じ。

コンピュータはルール通りに解釈するから
どんな書き方でも解釈できるが、
人間はそうは行かない。

句読点と一緒で、コンピュータにとっては不要でも
適度に改行やスペースや区切りがあると
人間は見やすくなる。

人間にとって見やすいのは何か?
それはなんでも省略することではないと思う。
768デフォルトの名無しさん:2013/08/18(日) 23:38:42.37
> 樹を見て森を見ず

木と森の判定がお前の主観になってんだっつの
769デフォルトの名無しさん:2013/08/18(日) 23:39:59.11
>>752
> Rubyの -> x { c } という構文は、Ruby2.0から採用されているね
> これが違和感のある構文だというのは、自分も認める
> この -> は、矢印ではなくてギリシャ文字のラムダを横に倒したものらしいが、
> 正直言ってコジツケだし、写像関係の矢印とまぎらわしい

今はUnicodeが自由に使える時代なんだから、
ASCIIの範囲で書ことうせずに、Unicode使えばいいのにね。

文字が入力できないという問題は
IMEやテキストエディタの問題。
770デフォルトの名無しさん:2013/08/18(日) 23:40:01.00
こういう逆ポーランド記法と一緒で、記述位置と内容に違いはなく完全な一対一対応してるだろ。

3 4 + =  3 + 4
1 5 + 2 3 + *  =  (1 + 5) * (2 + 3)
771367:2013/08/18(日) 23:41:02.01
>>754,756
>>736の引用カキコで書いてあるように、コードの読み手にとって
素直に迷い無く読みとれるか否か?という視点だよ
>>752で書いたように、キーワード lambda が先行するのだから、
それをラムダ式の仮引数以外の何かと誤解するとは考えにくいと思うけど、
いかがかな?
772デフォルトの名無しさん:2013/08/18(日) 23:42:42.93
いや、違和感あるし読み難いよ
だからアウトな
773デフォルトの名無しさん:2013/08/18(日) 23:44:41.17
>>766
> ナリスマシかよw


   AA省略


  ナリス・マーシー (1900〜)
774デフォルトの名無しさん:2013/08/18(日) 23:49:49.33
>>771
ブロック引数にこんな記法使う言語なんかないし、
実際、ブロックローカル宣言と区別付かないし、
素直に迷いなくは読めないからやっぱりアウトな。
775367:2013/08/18(日) 23:55:08.59
>>764
Pythonの最後のコードは>>650で、(不可解な)if式を使っている部分が以下の行

f = lambda xss, x: (xss, xss[0 if x < xs[0] else 1].append(x))[0]

この行は

f = lambda xss, x: (xss, xss[if x < xs[0]: 0 else 1].append(x))[0]

とは書けないから、「Pythonは式指向ではない」ことが明らかになった

if x < xs[0]: 0 else 1 の部分だね
776デフォルトの名無しさん:2013/08/18(日) 23:57:31.98
>>775
それPythonのif式で書けちゃってるじゃん

お前、Pythonのif式がダメって結論からスタートしちゃってるよ
それじゃダメな理由が説明出来てない
777デフォルトの名無しさん:2013/08/18(日) 23:57:36.07
✕「Pythonは式指向ではない」ことが明らかになった
○「Pythonは私の好みに合わない」ことが明らかになった
778デフォルトの名無しさん:2013/08/18(日) 23:58:43.70
表面的などうでもいいこと。
英語で動詞が先に来たり、結論を先に述べるとかと一緒で言語の内部設計と関係がない。
779デフォルトの名無しさん:2013/08/19(月) 00:00:11.32
おいおい
「明らかになったのではないかな?」とか言っといて
よくよくきいてみれば「俺好みの順番では書けていない」かよ。
ふざけんな
780デフォルトの名無しさん:2013/08/19(月) 00:00:21.42
>>777
---- 壁5. 式指向(条件判定式)の壁 ----

じゃなくて

---- 壁5. 私好みの壁 ----

なんだなw
781367:2013/08/19(月) 00:02:27.07
>>769
その考え方を導入した言語が Fortress だね
 http://ja.wikipedia.org/wiki/Fortress
日本語の解説書も出版されている

・Fortress言語―マルチコア時代の並列化プログラミング言語
 http://www.amazon.co.jp/dp/4765533379/
782デフォルトの名無しさん:2013/08/19(月) 00:03:00.81
順番だの自然さだのなんて主観は「樹を見て森を見ず」。
完全に本質を外しているよ!
と言ってあげたい。
783デフォルトの名無しさん:2013/08/19(月) 00:04:20.84
>>780
それは400台のレスで既に明らかになってるよ
367の言う「式指向」という言葉は「構文の見た目が私の好みに合っている」という意味
784デフォルトの名無しさん:2013/08/19(月) 00:07:41.10
はい終了
785デフォルトの名無しさん:2013/08/19(月) 00:08:51.84
>>783
え?そういう話なの?!
786367:2013/08/19(月) 00:14:40.55
>>776
理由については、>>738を参照汁
787デフォルトの名無しさん:2013/08/19(月) 00:21:45.49
Ruby1.9のTCO実装は不完全だから壁は越えられないでFA?
788デフォルトの名無しさん:2013/08/19(月) 00:23:04.40
Rubyの exec if cond はどう説明するの?
関数型的な機能じゃないから見て見ぬふり?
789デフォルトの名無しさん:2013/08/19(月) 00:24:10.41
もう面倒だから、誰かが異質だって言ったら即アウトにしよう
790デフォルトの名無しさん:2013/08/19(月) 00:24:37.69
>>788
きゃつの主観で無視できる存在らしいぜ。
791デフォルトの名無しさん:2013/08/19(月) 00:25:55.25
少なくとも>>775は上と下で読みやすさに差が無いな
むしろ若干上の方が読みやすいくらい
792デフォルトの名無しさん:2013/08/19(月) 00:26:29.34
聞けば聞くほど判断基準が怪しく思えてくるな
793デフォルトの名無しさん:2013/08/19(月) 00:27:11.35
>>787
いいよそれで
794デフォルトの名無しさん:2013/08/19(月) 00:30:48.95
Haskellのリスト内包表記もどっちかというと>>775の上やexec if condに近いタイプだが、
あれは許せるのか?
ちなみにPythonもほぼ同じ表記を採用している
795デフォルトの名無しさん:2013/08/19(月) 00:34:21.26
おまえら暇だなぁw
こんなrubyキチに付き合うとはw
796デフォルトの名無しさん:2013/08/19(月) 00:38:47.98
>>795
別に関数型言語が偉いとか誰も何も言ってないのに、Rubyの順位が高いだけで
脊髄反射のようにRubyキチ扱いする奴ってどうなのかねぇ?
797デフォルトの名無しさん:2013/08/19(月) 00:41:28.32
I like the Python version better,
because it keeps the two options next to the condition itself,
rather than throwing one of the two possible results way over on the other side of the positive result.
It is easier to see the condition as controlling both of the possible expressions,
with one in its left hand and the other in its right.

Plus, it reads very cleanly as English grammar,
and readability is one of the things that drew me to Python in the first place.
798デフォルトの名無しさん:2013/08/19(月) 00:43:10.25
>>796
ここまで見る限り十分論理的な批判ばかりだと思うぞ
誰もRubyをdisってるわけじゃないし
799デフォルトの名無しさん:2013/08/19(月) 00:43:36.50
>>796
言ってることがおかしいぞ?
さてはおまえもRubyキチか?
800デフォルトの名無しさん:2013/08/19(月) 00:45:39.36
Rubyは一番手に馴染む
801デフォルトの名無しさん:2013/08/19(月) 00:48:11.56
左から右へ流れなきゃいけないってむしろ手続き型の頭だろ
SQLとかもそうだけど宣言型では方法より結果を先に書くのが好まれる傾向がある
802デフォルトの名無しさん:2013/08/19(月) 00:49:00.34
超訳
結果が左と右に綺麗に分かれていて見やすいし、条件が結果を
コントロールしていることがよく分かる
それに、英語の文法に沿っていて読みやすい
読みやすさは重要だ

つまり、英語のネイティブにとって、英語に近いPythonの方がむしろ
読みやすいという意見があるようだね
803デフォルトの名無しさん:2013/08/19(月) 00:49:22.20
式指向()では違うんだとさ。
804デフォルトの名無しさん:2013/08/19(月) 00:52:37.33
そもそも、左から右へ流れてる流れてないというのは
どういう基準で決まるんだ。
「もしも~ならこうして、そうでないならこうする」という日本語の
流れに沿ってるのが左から右へ流れてるってこと?
だとすると、英単語を使ってるPythonからしたら噴飯ものだよね
805デフォルトの名無しさん:2013/08/19(月) 00:56:44.99
宣言型というよりか、結果が先に来るのは
英語の文法のせいじゃね?

もし、英語が日本語のように
結果を後に書く文法だったら、
右から左なんてものもなかっただろう。

SQLも、「○○テーブルから、○○という条件に合うものを、抽出」という
書き方になっていただろうね。
806デフォルトの名無しさん:2013/08/19(月) 00:57:41.84
一行に複数の文を書いたら、
左から右へ処理が進むわけで、
右から左という流れがそもそもおかしいんだろう。
807デフォルトの名無しさん:2013/08/19(月) 01:01:16.24
代入式も右から左だし
関数の定義だって入力と出力を先に書いてからそのあと中身書くでしょ
808デフォルトの名無しさん:2013/08/19(月) 01:01:20.97
そもそもRubyだって代入は右から左に処理が進む
367が大好きな流れの向きとは逆
809デフォルトの名無しさん:2013/08/19(月) 01:03:13.06
そもそも、関数が
function(a,b)みたいな順序になったのも英語のせいだな
動詞、目的語という語順だから
だから、目的語に対して時系列に左から右へと関数が
適用されていくという形を取ることができなかった
このせいでプログラミングの世界は遅れてしまったと思う

それに、配列とただの値を区別するのも英語らしい
全てが配列であり、普通の値は、長さが1の配列として扱えたら
統一的に扱えていいのにと思ったことはいくらでもあるけど、
日本語が主流だったらそういうスクリプト言語ができていたかもね
810デフォルトの名無しさん:2013/08/19(月) 01:07:45.41
perlの変数がスカラーと配列で最初の文字が変わってくるのも
英語の単数系と複数形の影響だろうね
Ruby作者が「私には複数か単数かなんてことはどうでもいいので、
Rubyはそうなってない」という話をしてるのを聞いて、ああ、日本人なんだなあ
と妙に納得したよw
多分英語圏の人にとっては、どうでもいいことじゃないんだろうねえ
811デフォルトの名無しさん:2013/08/19(月) 01:08:33.73
左から右に流れるのが好きなのは別に構わんが、
Haskell等の関数型言語の関数合成は右から左
だから、関数型プログラミング適正とやらとは無関係ですね
812デフォルトの名無しさん:2013/08/19(月) 01:10:40.92
>>811
無関係だろうね
ただし、劣ってると思う
時系列に左から右へと行く方が明らかに便利
英語に引きずられておかしなことになってしまった
全ては英語が劣った言語のせい
813デフォルトの名無しさん:2013/08/19(月) 01:16:35.72
関数の語順までいくと、ラテン語のさらに前の言語くらいまで起源が遡りそうだが
まあ欧州圏の言語族ではあるだろうな
814デフォルトの名無しさん:2013/08/19(月) 01:18:10.84
だらだら書く分には左から右が好きかな
読むときは左に結果が来てる方が読みやすい

書き捨てコードが主戦場のRubyは左から右であるべきだな
815デフォルトの名無しさん:2013/08/19(月) 01:26:07.03
結論が先にきたほうが分かりやすいのは前置きが長い場合かな
そういうのはIdeの機能で飛ばしたり畳んだりとどうとでもなるが
816デフォルトの名無しさん:2013/08/19(月) 01:28:16.34
コードが短かったりIDEの入力・表示補助があるなら
どっち向きにコードが流れるかなんて
どうでもいい
817デフォルトの名無しさん:2013/08/19(月) 01:33:58.53
基本は上から下、左から右が分かりやすいに決まってるだろ
英語圏のバカどもが、英語の感覚でやるからそれに気づかなかっただけ
英語以外の民族にはいい迷惑
オブジェクト指向が流行ったのも、ぶっちゃけ英語と反対の語順で書けて、
時系列と流れが一致して分かりやすくなったからだ
818デフォルトの名無しさん:2013/08/19(月) 01:39:10.26
住所の書き方が一番納得できない
819デフォルトの名無しさん:2013/08/19(月) 01:40:16.71
あれ?式指向()が論破されちゃったから
腹いせに英語をdisることにしたの?
820デフォルトの名無しさん:2013/08/19(月) 01:40:55.60
流れに逆らうってのはどだい無理が出てくる
あとから参照するために、Itやらthatやらに相当する変数がたくさんいるんだよ
これでプログラミング不必要な変数を乱発しわかりにくいものになった
それもこれも語順が間違ってたせいだ
Jqueyなんかがメソッドチェーンで人気を博しているけど、
最初からそうなるべきだったんだよ
821デフォルトの名無しさん:2013/08/19(月) 01:43:28.90
代入が右から左なのに、それ以外が左から右だと
代入する側とされる側が遠く離れて読み難いんだよ

だから、x = y で x が y に代入される言語を作ってから戻ってこい。な?
822デフォルトの名無しさん:2013/08/19(月) 01:44:19.75
正直日本語でも
「こうするよ、~ならね。さもなくばこうする。」とは言えるし
時系列もこの場合は関係ないから、Pythonの式でも別に不都合はないよ
823デフォルトの名無しさん:2013/08/19(月) 01:55:08.86
パイプは左から右への流れだな。

echo hello | sed 's/$/ world/' | wc -c

関数もこんな表記を採用すればよかったんだよ。

v = foo(bar(baz(123))) みたいなカッコの対応取れてるか?
って問題は発生しない

123 | baz() | bar() | foo() => v

メソッドチェーンみたいで見やすいだろう?

まあ引数が複数になった時どうするかって話があるけど。
824デフォルトの名無しさん:2013/08/19(月) 01:59:54.05
処理の流れは左から右がいいが、定義は話が別。

日本語の辞書でもそうだが、
まず単語がでてきて、その説明を書く。

------------------------------
★プログラミング言語
プログラミング言語(プログラミングげんご)とは、
コンピュータに対する一連の動作の指示を記述するための人工言語の総称である
------------------------------

みたいにね。

定義とはC言語で言う#define みたいなもの。
関数の定義もそう。左は右と等価であることを示すもの。
なお代入は定義ではない。
825デフォルトの名無しさん:2013/08/19(月) 02:19:38.38
>>824
よく分からない
定義が先に出てくると、なんで左から右じゃないの?
826デフォルトの名無しさん:2013/08/19(月) 02:24:10.47
だいたい、代入が右から左とか言ってるけど、それは錯覚だ
矢印を変えればあら不思議
v => 123
左から右だろ?
しかも、これは「vが出て来たら、123に置き換えろ」と読めるから合理的
実は代入の矢印はみんなが考えてるのとは逆にするべきなんだよ
827デフォルトの名無しさん:2013/08/19(月) 02:34:38.39
x = y + 1 とは書けても
x + 1 = y とは書けないから、代入は紛れも無く右から左だよ
828デフォルトの名無しさん:2013/08/19(月) 02:50:19.62
例えば、x = x + 1 と書くことが出来る。

これが定義であるならば、

x = x + 1
x = (x+1) + 1
x = ( (x+1) +1) + 1
 :
 :
となって意味不明なことになる。

だからこれは定義ではない。
829デフォルトの名無しさん:2013/08/19(月) 02:55:01.03
#defineの動きを見てみよう。

#define VALUE foo() + bar() // この時点では処理は実行されない。
int value = foo() + bar() // 処理が実行されvalueに値が入る。

printf("%d", value); // 変数の値を出力するだけ
printf("%d", VALUE); // ここでやっと処理が実行される。


このように、代入と定義は実行されるタイミングが違う。
定義だと必要になるまで実行されない。
すなわち、遅延評価と同じものなのだ
830デフォルトの名無しさん:2013/08/19(月) 03:11:49.69
>>826
ソッコーで>>827に論破されててワロス
Ruby厨って存在自体が恥ずかしいね
831デフォルトの名無しさん:2013/08/19(月) 03:17:58.16
俺はRuby厨でなんでもないのだが、仮にy+1=xとかけないからと言って
なんで紛れもなく右から左になるのか分からない
単に、方向が固定されてることを示しただけであって、それが右から左なのか
左から右なのかはその議論からは確定しないじゃないか
しかも、y+1=xと書けないのはそういう規則にしているだけの話だろう
832デフォルトの名無しさん:2013/08/19(月) 03:24:15.53
y = x + 1 って、時系列的には x + 1が計算されて、その結果がyに代入されるって順番だよね?
まさか、これすら受け入れられないレベル?
833デフォルトの名無しさん:2013/08/19(月) 03:25:07.84
>>829
君のネタはとても面白いからコテつけてくれないか
834デフォルトの名無しさん:2013/08/19(月) 03:34:26.26
>>832
そういう話ならカッコの有無とか演算子の優先順位で状況次第ってことになる
自分はそういう話をしてるつもりはないんだけど、もともとは
流れ的にそういう話だったみたいだな
多分、文脈と違う話をしてたわ
スマン
835デフォルトの名無しさん:2013/08/19(月) 03:43:39.14
>>829
誰も定義と代入が一緒だとは言ってないと思うんだが
なぜに一生懸命そういう説明をしてるんだ?
836デフォルトの名無しさん:2013/08/19(月) 04:03:32.72
まあjsとかpythonとかの場合、関数定義を変数に代入したりするから
ややこしいんだが
837デフォルトの名無しさん:2013/08/19(月) 04:44:07.05
>>833
面白いならコテつけなくても
見分けつくだろう?

まあ、つける気はないが。
838デフォルトの名無しさん:2013/08/19(月) 05:53:31.83
上から下、左から右という手続き型の基本原理に洗脳されてる奴ってことだ。
結論が先で詳細、条件があとは関数型だからあり。
TrueResult if Conditions
TrueResult if Conditions else FalseResult

x = y + z という代入と同じ仕組み。
これは手続き型では特例で本来は、y + z -> xという処理の順序で書かれるべき。
839デフォルトの名無しさん:2013/08/19(月) 05:59:01.59
お前ら目を覚ませ
840デフォルトの名無しさん:2013/08/19(月) 07:26:11.89
関数型も本来は上から下、左から右であるべき
そうでないから引数に余計な括弧がついたりするんだ
841デフォルトの名無しさん:2013/08/19(月) 09:30:30.22
>>838
それは正確には、+演算子の優先順位が代入演算子の優先順位より高いというだけ
別に例外でも何でもなく、よくあること
たとえば、1+2*3などは乗算から先に計算するがこれと全く一緒の理屈
842367:2013/08/19(月) 09:42:26.44
>>735
RubyのTCO情報について、提供ありがとう
この文書の存在は知らなかったので、興味深く読ませてもらいました

これは、将来的に特殊なケースでTCOが有効化されないという実装の不完全性(バグ)が
発見されたと仮定した時、それをどう扱うのか(=どう判断すべきか)?という話だね
つまり、(Schemeのように)言語仕様としてTCO実装を必須(MUST)にすべきか、
あるいは(Common Lispのように)TCO実装は推奨(SHULD)にするかという判断だ

もし前者であれば、たとえ特殊なケースであってもTCOが有効化されなければ
(仕様として)不完全であると判断されるし、後者であれば、特殊なケースでTCOが
有効化されなくてもTCOが実装されていると判断できる
そして、その質問に対し、Matzは後者であると答えている

>>707に話を戻すと、「末尾再帰最適化の壁」が(前者の)言語仕様を意味するのであれば
Common LispとRuby1.9は「どちらも不完全だから壁は越えられない」となるし、
これが(後者の)実装依存を意味するのであれば
Common LispとRubyは「どちらも壁は越えている」と見なせる

>>787
どちらの判断でも(個人的には)かまわないと思うけど、Common Lisp支持派の
意見も聞きたいので、本件の判断は保留、つまり現状維持とさせていただきます
843デフォルトの名無しさん:2013/08/19(月) 09:44:57.26
そもそも、結論が先と言ってるわりに、falseResultは一番最後にきてるじゃん
844デフォルトの名無しさん:2013/08/19(月) 10:15:27.94
>>841
馬鹿だなぁ。代入の話は演算子優先順位とは全然関係ない
優先順位を弄っても、「y + zの値をxに代入する」という処理で
y + zを=の左側に持って来れるわけじゃないからな

出来るもんならやってみ?
845367:2013/08/19(月) 10:38:44.62
>>707の「式指向の壁」について、結局、>>783の引用カキコに対して
正面からは反論できない、ということでいいのかな?

つまり、Pythonのif式、<true> if <cond> else <false> の読みやすさについて
英語文法として自然である(>>802)とかといった意見はあるけど、
もしそれら意見に客観性があるのならば、

 条件分岐式があるPython以外の言語 Smalltalk/Lisp/ML/Haskell の設計者達も
 Pythonと同様の構文を採用したはずであるのに、実際にはそうならなかった....

この矛盾を説明できない限り、「式指向の壁」は壊せないよ
846367:2013/08/19(月) 10:40:52.30
>>794
Pythonのif式とHaskellのリスト内包表記に類似性を見いだせるという意見は理解できし、
リスト内包表記はHaskellとPythonに固有の優れた特徴(個性)だと思う
ただし、プログラム言語の基本要素である条件分岐構文 if <cond> then <true> else <false>
について、Haskellはそれを「式」として定義し、Pythonは「文」として定義した

Haskellにとってif-else式は欠くことのできない基本要素であるのに対して、
リスト内包表記はfilter/mapの組合せ処理を簡便にする構文糖であり、必須の構文ではない
この理屈は、Pythonにも当てはまるはずだ
Pythonにとって「if <cond>: <true> else <false>」というif文は、言語として基本要素なのだから

もし反論があるなら「論よりコード」、クイックソートをif文を使わずif式で書いてみて、
それがPythonらしい可読性のあるコードかどうかを批評するところから始めればいい


>>788
これも上段の説明と同じだ
Rubyにとって条件分岐の基本はif式であって、if修飾子ではない

実際、クイックソートのRubyコードで(>>560,665)if式は使われている(=使わないと書けない)けど、
if修飾子は使われていない(=使わずに書けている)ことは実証された

三項演算子の議論と同様に、枝葉の矛盾で幹ごと倒そうとする論法を「詭弁」と言う
847デフォルトの名無しさん:2013/08/19(月) 10:48:52.62
>>777
テスト
848367:2013/08/19(月) 10:56:48.15
>>432
遅レスになったけど、>>665等で三項演算子を使ってみた
これは>>429の「条件分岐が入れ子になった時に最も深い分岐で使う」ケースになる
普段であれば迷わずif式を使って以下のように書くけど、>>429でそう書いたので、
三項演算子を使っても構わないレアケースとして紹介したつもりだ

三項演算子(>>665):
  e < array[0] ? [xs << e, ys] : [xs, ys << e]

if式:
  if e < array[0] then [xs << e, ys] else [xs, ys << e] end
849デフォルトの名無しさん:2013/08/19(月) 10:57:55.54
>>846
それこそ詭弁だ。
条件分岐式として使う局面に限定した場合、
Rubyのif修飾子はPythonのif式と違い、
else節がないという致命的な欠陥がある。
致命的欠陥品が使われない(事実上使用できない)ことをもって
それが記述の順による使いにくさに起因すると因果関係すり替え、
Pythonタイプのif式が使いにくいものであるという
結論に持って行くのはフェアーじゃない。
850デフォルトの名無しさん:2013/08/19(月) 11:15:33.85
るいとも
851367:2013/08/19(月) 11:39:14.31
またアンカを間違えていた
>>845の先頭行を訂正する

X: 結局、>>783の引用カキコに対して
O: 結局、>>738の引用カキコに対して
852367:2013/08/19(月) 11:47:03.63
>>849
たしかにRubyのif修飾子にはそういった欠点がある
だからRubyにとってif修飾子はオマケであって、if式が条件分岐の基本構文という位置付けになる
オマケに欠陥があるからといって、基本を無視するのは間違っているよ、という話であり、
それを「樹を見て森を見ず」と揶揄している

それに対して、Pyhtonでは、条件分岐の基本構文は(式でがなく)if文として定義され、
しかも(オマケ?の)if式には、他言語の常識に反した構文(>>738)という矛盾を抱えている
独りよがりな常識はずれの構文なのに、それを認めることこそ(他言語に対して)アンフェアだと
考えるし、なぜPython特権を認めにゃならんの?という話だ


繰り返しになるけど、(>>845で書いたように、)>>783の矛盾は「誰も説明」できないのかな?
853367:2013/08/19(月) 11:49:11.15
またアンカを間違えていた....orz
>>852の最終行を訂正する

X: >>783の矛盾は「誰も説明」できないのかな?
O: >>738の矛盾は「誰も説明」できないのかな?
854デフォルトの名無しさん:2013/08/19(月) 12:08:14.75
どうあっても

367の言う「式指向」という言葉は「構文の見た目が私の好みに合っている」という意味

であることを367本人としても強調したいらしいなw
855367:2013/08/19(月) 12:40:33.16
>>852の最終行を(>>854から)再訂正する
>>854では、「何が矛盾なのか」分かりにくい文章だった

X: >>783の矛盾は「誰も説明」できないのかな?
O: >>845(>>738)の矛盾は「誰も説明」できないのかな?
856デフォルトの名無しさん:2013/08/19(月) 13:03:07.10
>>855
ん。>>854はなにも矛盾していないぞ?
857デフォルトの名無しさん:2013/08/19(月) 13:07:39.22
>>855
矛盾なんか別にないだろう。

C系言語のif文の列びに準じようとする判断が勝ったか、
英語表現としての自然さを重んじる判断が勝ったか

の違いってだけ
858デフォルトの名無しさん:2013/08/19(月) 13:53:25.63
手続き型のシェアが9割以上とおなじ。
Pyhtonが先駆的なだけだろ。
859デフォルトの名無しさん:2013/08/19(月) 17:03:05.48
人工言語に自然言語の性質を求めてもねぇ
860デフォルトの名無しさん:2013/08/19(月) 17:26:03.08
なんのための形式言語なんだ、って話だよな
861デフォルトの名無しさん:2013/08/19(月) 17:54:07.82
処理の流れと一致する必要はない。
代入(=)や、C/C++のプロトタイプや、本の目次などは処理の流れと一致してない。
862デフォルトの名無しさん:2013/08/19(月) 18:26:26.45
それらはもともと自然言語にない表現だし視認性や可読性もあるしな

英語表現としての自然さを建前に
視認性や可読性を損なってもいいのかということ
863デフォルトの名無しさん:2013/08/19(月) 19:21:29.90
Ruby使用者ってこんなのばっかりなの?
いくら正論で反論して論破しても>>367が屁理屈ゴリ押しで擁護するから
逆にRubyの印象を悪くしているのに
864デフォルトの名無しさん:2013/08/19(月) 19:32:20.41
>>863
誰一人Ruby言語自体をdisってはいないのにRubyがdisられていると思い込んでいるのがポイント
これぞRubyって感じだね
865デフォルトの名無しさん:2013/08/19(月) 19:36:33.87
>誰一人Ruby言語自体をdisってはいない
やめなよそういう言い切りは
君が過去スレまで遡って「Ruby言語自体をdisるレスは一つもなかった」ことを証明しないといけなくなるよ
866デフォルトの名無しさん:2013/08/19(月) 19:48:44.15
Haskellのリスト内包表記
[x*x | x <- list, x < 3]
これ、明らかに式指向()に反してると思うんだけどどう?
867367:2013/08/19(月) 20:46:58.37
>>857
Pythonの(不可解な)if式構文の正当性に関する根拠である
「英語表現としての自然さを重んじる判断」には客観性がある ==> 仮説

それ以外の言語では条件分岐式構文として、上記の判断よりも
「C系言語のif文の列びに準じようとする判断」が勝った ==> 事実

もし「仮説」が正しければ、それは「事実」と反する、だから「矛盾」だろ?

しかもPythonのif文の構文は「C系言語のif文の列びに準じようとする判断」で設計された
これはPyhton自身の「内部矛盾」を意味する
つまり、ある時には「英語表現としての....」を、また別の時には「C系言語の....」を言うという、
ご都合主義でPyhtonは設計されたことになるけど、それでもいいの?という話だ

そして、この矛盾を解消(説明)できなければ、仮説「英語表現としての
自然さを重んじる判断」は、独りよがりな主観にすぎない、と言えるのではなかろうか
868デフォルトの名無しさん:2013/08/19(月) 20:53:54.08
別に、Pythonって他の言語が採用してなくても
自分らが読みやすいと思った構文を採用してるだけだろ

たとえば、if式以外でも、 1 < x && x < 10 を 1 < x < 10 と書けるのも
Python以外で殆ど見た事ない
869デフォルトの名無しさん:2013/08/19(月) 20:59:07.78
>>867
ご都合主義で場当たり的に追加された言語っていうのは
procオブジェクトがあるのにlambdaオブジェクトを追加した
Rubyのような言語を指すんだよ
870デフォルトの名無しさん:2013/08/19(月) 21:02:12.68
はいRuby言語仕様をdisるレスきましたー
871デフォルトの名無しさん:2013/08/19(月) 21:04:35.27
>>867
if修飾子は?
872デフォルトの名無しさん:2013/08/19(月) 21:05:40.49
procとかlambdaとかで微妙な違いがあったりするのがrubyの嫌らしさ
873デフォルトの名無しさん:2013/08/19(月) 21:07:06.91
>>867
構文ごとに判断がなされているだけなのに
なんで矛盾なんだ?
非一貫性、非対称性はRubyにだってあるだろうに。
874デフォルトの名無しさん:2013/08/19(月) 21:10:56.99
要するにPythonをdisって、
いや、Pythonに限らず他言語の瑕疵をあげつらって
Rubyを持ち上げたいだけなんだろ?
ほんっっとMatz以下、Ruby信者には虫ずが走るわ。
875デフォルトの名無しさん:2013/08/19(月) 21:11:30.75
>>867
Rubyにも「式 if 条件」の構文あるけど、Rubyもご都合主義で設計されたの?
しかも367曰く殆ど使われてないみたいだけど、そんな使われない構文を足すなんて
深く考えずに設計されてるんじゃないの?
876デフォルトの名無しさん:2013/08/19(月) 21:12:08.76
そうですね
Ruby信者が絶滅すれば他の言語の使用者は互いにdisったりしないから
このスレも終了ですね
877デフォルトの名無しさん:2013/08/19(月) 21:13:53.35
しかも 式 if 条件 って式じゃなくてステートメントだよね
式志向(笑)
878デフォルトの名無しさん:2013/08/19(月) 21:23:14.41
>>876
バトル=disり、とは限らない
879デフォルトの名無しさん:2013/08/19(月) 21:29:06.00
主観でしかないものを客観だと言ってるからツッこまれてんだろ
言語のdisりの問題じゃねーわ
880デフォルトの名無しさん:2013/08/19(月) 21:29:33.87
後置のifが見やすい使い方って

return if 条件

以外になんか有る?
881デフォルトの名無しさん:2013/08/19(月) 21:34:39.01
くだらねえ所に食い付きすぎ
882デフォルトの名無しさん:2013/08/19(月) 21:41:56.06
>>864
言っとくけど、
ifは最初に持ってきても
英語表現だからな。
883デフォルトの名無しさん:2013/08/19(月) 21:44:45.83
>>867の間違い。

Pythonのif文の構文は「英語のif文の並びに準じようとする判断」で設計された
だから、「if 条件 式」と「式 if 条件」の二つの書き方ができる。
どちらも英語表現だ。
88457:2013/08/19(月) 21:47:27.10
ありがとう
英語とpythonの両方に詳しくなりました。
885デフォルトの名無しさん:2013/08/19(月) 22:12:32.25
>>878
いや、このスレは最後の1言語が残るまでdisりあうスレなんだけどな
886デフォルトの名無しさん:2013/08/19(月) 22:25:36.19
あ、まだ頑張ってたのか
887367:2013/08/19(月) 22:35:16.85
>>846
自己レスになるが、Pythonコードでクイックソートは書けないのかな?

「式指向の壁」を越えた言語、Haskell(>>597)、ML(>>626)、Ruby(>>560,665)では、
どれも同じスタイル(パターンマッチまたはif式)でクイックソートのアルゴリズムを表現できている
後出しで条件を追加するのは失礼だから、先に書いておくよ:
1) if文は一切使用せず、if式だけで書くこと <== この条件クリアが式指向であることの証明になる
2) クイックソートのアルゴリズムを表現していること -- >>599はNG
3) 標準ライブラリ(itertoolsやfunctoolsなど)はOKだが、それ以外(numpyなど)はNG -- >>633,635
4) 効率を考慮すること -- >>636,638
5) 可読性に配慮すること -- >>640,649

これら条件は、他の言語との公平性を考慮したつもりだ
論よりコード、「Pythonが式指向言語である」ことの実証を期待したい
888デフォルトの名無しさん:2013/08/19(月) 22:47:52.10
>>887
色々つっこまれてんだから、先にそれらに答えろよ馬鹿
889デフォルトの名無しさん:2013/08/19(月) 22:48:33.59
>>887
お前の好みだとPythonのif式は可読性に劣るんだったよな?
1) と 5) という同時に満たせない条件出してなに公平づらしてんだよ。
馬鹿が。
890デフォルトの名無しさん:2013/08/19(月) 22:51:15.70
いいかげん、367はスルーの方針でいいんじゃないのか?
891デフォルトの名無しさん:2013/08/19(月) 23:01:40.24
人の話を訊くつもりが無いなら
自分のブログにでも書いてろって話だよな
892デフォルトの名無しさん:2013/08/19(月) 23:36:29.27
ifとかはまだマシだろ
Pythonのdefや代入は文だからquicksortという関数を定義したければ
globals().__setitem__('quicksort', lambda xs: ....
と書かないといけない
この方法のquicksort定義にはYコンビネータが必要な気がする
あと、例外処理無理すぎる
893デフォルトの名無しさん:2013/08/19(月) 23:49:01.50
Haskellの関数定義(名前束縛)も式じゃないでしょ
894デフォルトの名無しさん:2013/08/19(月) 23:58:33.32
>>893
静的型言語のdeclarationはまた異なるカテゴリじゃないのかなぁ
Pythonのdefや代入のようなstatementは実行時に「副作用を目的として使用する」
もんだから関数プログラミング的ではないと言えるし
expression orientedかどうかってのは結局statementとの対比でみてるよね

http://en.wikipedia.org/wiki/Expression-oriented_programming_language
895デフォルトの名無しさん:2013/08/20(火) 00:01:56.93
そもそも例外処理は関数型プログラミングと相性悪い
896デフォルトの名無しさん:2013/08/20(火) 00:04:47.93
Pythonを式志向というのは無理だが、PythonはPascalみたいな
nested functionサポートしてるし、
method含めfunction(Python用語でいうとcallable)は全て第一級オブジェクトだよ
nested functionなんてALGOL68の時代からあるのに意外とサポートしてない言語あるよね
無名関数定義できるだけ、みたいなの
897デフォルトの名無しさん:2013/08/20(火) 00:07:59.80
def partition(xs, f):
    return reduce(lambda xss, x: (xss, xss[0 if f(x) else 1].append(x))[0],
                  xs, ([],[]))

def qsort(xs):
    return (lambda (ss, ls) = partition(xs[1:], lambda x: x < xs[0]):
            qsort(ss) + xs[:1] + qsort(ls))() if len(xs) > 1 else xs
898デフォルトの名無しさん:2013/08/20(火) 00:18:07.81
>>844
それはできないが、演算子の順位をいじれば、x=y+zで、「左にある=が右にある+
よりも先に行われる」ことはできるよ
+よりあとに代入が行われるのを持って、君は「代入は右から左だ」と
言ってるんじゃなかったの?
どうやらその反論をみると違う理由のようだけど、それを説明してくれないか?
俺にはなぜ君が代入が左から右だといってるのか分からなくなったわ
899デフォルトの名無しさん:2013/08/20(火) 00:18:51.27
訂正
なぜ右から左だと言ってるのか
900デフォルトの名無しさん:2013/08/20(火) 00:26:33.02
>>898
> +よりあとに代入が行われるのを持って、君は「代入は右から左だ」と
> 言ってるんじゃなかったの?

理解出来ないなら無理に絡んでくるなよ、馬鹿だな

時系列にそって左から右に処理が進むべきって話が>>806あたりの議論で
代入は処理を左に書けないだろうって意見が出たんだろ
だから、「+よりあとに代入が行われるとき、+は代入より左にある」のでなければ、
左から右に処理が進むことにならんだろうが
901デフォルトの名無しさん:2013/08/20(火) 00:29:06.78
y = f(x)は関数型の特徴を表す。
902デフォルトの名無しさん:2013/08/20(火) 00:46:56.93
>>895
そりゃそうだが、tryだのhandleだのが一種のパターンマッチ式なML族と
ステートメントなC++やPythonとでは式志向かどうかという観点では
全然違うと言わざるを得ない
903デフォルトの名無しさん:2013/08/20(火) 00:50:51.98
>>900
意味不明だなあ
それはできないけど、+が後の場合は左から右にかける
もちろん、先の場合は無理だよ?
でも、それは代入の演算子の優先順位が高かった場合、同じように
「代入が+より前に行われる時に、代入を右側に書くことは出来ない」
んだけど、なんでそれは左から右と言っちゃいけないんだ?
904デフォルトの名無しさん:2013/08/20(火) 00:54:33.90
すまん、なんかこんがらがって論理の反転の仕方を間違えたようだw
まあでも言いたいことは分かるだろw
905デフォルトの名無しさん:2013/08/20(火) 00:59:32.28
>>903
あのさ、元々「全部メソッドチェインみたいに書けるべきだな」「おっと代入は無理だったわ」って話なんだぞ?
そのへん理解してる?


あとさ、演算子優先順位は関係ないんだって何度も言ってるだろ

> 「代入が+より前に行われる時に、代入を右側に書くことは出来ない」

これは括弧使えば x + (y = z) って書ける言語はある。でも

> 「+よりあとに代入が行われるとき、+は代入より左にある」

こっちは括弧使って演算子の優先順位変えても書けないだろ?全然違うんだよ馬鹿
906デフォルトの名無しさん:2013/08/20(火) 01:06:16.47
def qsort(xs):
  def qsort_logic(xs):
    ss,ls = [],[]
    for x in xs[1:]:
      (ss if x < xs[0] else ls).append(x)
    return qsort(ss) + xs[:1] + qsort(ls)
  return xs if len(xs) <= 1 else qsort_logic(xs)
907デフォルトの名無しさん:2013/08/20(火) 01:06:26.99
> 代入を右側に書くことは出来ない

これってさ、正確に言えば、
=を挟んで左側のものを、右側に入れることは出来ないって意味でしょ?

通常は変な書き方をしないから、単に代入を右側に書くことはできないって
言ってるのであって、

> x + (y = z)

これって、yにzを入れてるのであって、
zにyを入れてるんじゃないでしょ?

なら、代入を右側に書いていない。
908デフォルトの名無しさん:2013/08/20(火) 01:08:20.11
>>907
せやな
909デフォルトの名無しさん:2013/08/20(火) 01:12:37.18
>>907
右側とか左側とかじゃなくて、「右から左へ」「左から右へ」って言い方しろよ

で、確かに代入は「右から左へ」値をコピーする処理だけど、それが何か?
910デフォルトの名無しさん:2013/08/20(火) 01:12:41.59
「文字列」→変数

日本人としては、代入はこう書きたいな。
911デフォルトの名無しさん:2013/08/20(火) 01:19:25.14
>>906
>>887の要求を全て満たしてるのに、完全に手続き型のコードになっててワロタw
367の言ってる事って関数型プログラミングと関係無いんじゃね?
912デフォルトの名無しさん:2013/08/20(火) 01:23:43.98
ああ、だいたい、どういう意図かわかってきたわ
優先順位関係なく、+がどうやっても左にかけないから、
右側から左側だと言いたいわけね
演算子の順位も関係ないと

でもやっぱり理屈としては間違いだね
+をどうやっても左側に書けない本当の理由は、
+が右辺値にしか作用しないから
それだけの理由だと思う
逆にいえば、左辺値にしか作用できない、Cのポインタ操作にかんする
アドレス加算演算子とかはどうやっても左にしか書けない
それを遅らせなくてはいけない場合でもね
だから、結局判例が出来てしまう

処理が左から右に流れてるとか、右から左になが流れてるとかは、やはり+が左に書けないこととは関係ない
913デフォルトの名無しさん:2013/08/20(火) 01:24:54.71
>>911
効率を考慮する必要がある時点で関数型は使えないからね
914デフォルトの名無しさん:2013/08/20(火) 01:26:23.82
そして、演算子の優先順位こそが、左が先か右が先かを決定する
915デフォルトの名無しさん:2013/08/20(火) 01:34:35.18
>>912
メソッドチェインのように「左から右」に書けない処理があるって言ってるだけなのに、
「左から右」の処理を持って来て反例が存在する?
だれも全てが「右から左」だって言ってないだろ
本当に底なしのアホだな
916デフォルトの名無しさん:2013/08/20(火) 01:37:55.77
>>914
それだと x.foo().bar() と (bar . foo) x は両方「左から右に」処理が流れてることになるけど、そんな話だったっのか?
もうそれで良いならいいや、馬鹿の相手は疲れた
917デフォルトの名無しさん:2013/08/20(火) 01:40:45.94
>>915
つまり、「代入は右側から左だ」と言っておいて、
その本当の意味は実は「代入は左から右に処理を並べたくても、
書けない場合もあるよ」ってことだったの?
ごめん、完全に誤解してたわw
それなら文句ない
まあ、右から左に処理を並べたくてもかけない場合もあるけどw
918デフォルトの名無しさん:2013/08/20(火) 01:42:42.28
まあ、アドレス加算演算子の適用が「処理」かどうかは意見が分かれるところだが
919デフォルトの名無しさん:2013/08/20(火) 01:45:48.98
ん? Smalltalkのように代入操作をメソッド(例えば --> とか)として
定義できる言語ならメソッドチェインで代入も右に書けるぞ。w

| a b |
a := b := 0.
3 + 4 --> #a * 5 --> #b.
^{a. b} "=> #(7 35) "
920デフォルトの名無しさん:2013/08/20(火) 01:47:15.97
あ、ごめん、アドレス加算演算子は処理だね
アドレス演算子だと思った

ていうか、アドレスとか関係なく、加算演算子を左辺値に書けたっけ?
921デフォルトの名無しさん:2013/08/20(火) 01:47:52.30
>>916
言われてみれば、演算子の順位だけでは語れない部分もあるねえ
関数合成の場合、あとから合成した関数が呼びだだされる場合の処理の流れも
考慮にはいるかな
この辺はざっくり処理が左から右にかけるといっても曖昧なんだなってことがわかるね
まあでも、演算子の順位も加味されて処理の流れが決まってることに間違いはないけど
922デフォルトの名無しさん:2013/08/20(火) 01:49:09.95
>>919
おーすげー
動的型言語は代入と宣言が似た構文だからなー
その調子で変数宣言も書いてくれ
923デフォルトの名無しさん:2013/08/20(火) 01:50:12.21
うろ覚えだが、*a++=1みたいな場合だな
1=*a++とはそりゃかけんわ
924デフォルトの名無しさん:2013/08/20(火) 01:55:54.79
MonadやOCamlのletは左から右なのか?
結局右から左って何?
925デフォルトの名無しさん:2013/08/20(火) 01:59:05.31
Lisp使う事が多い俺には、左辺値だの優先順位だのと羨しい話だな
926デフォルトの名無しさん:2013/08/20(火) 02:00:46.08
>>924
最初に言い出したのは367なので、彼に聞いてください


>>738
> 普通の言語は「条件式 -> 式1 -> 式2」と左から右へ流れる(それが自然)
927デフォルトの名無しさん:2013/08/20(火) 02:22:51.81
英語では自然だというけど、証拠がありませんって
言ってるけど、797を書いた人物はどう見ても
英語が相当できる人物だろ
それでも納得しないのか
嘘をついてるとかネイティブレベルかどうか分からないとか
そういう厳しい基準の議論なの?
928デフォルトの名無しさん:2013/08/20(火) 02:36:36.20
めんどくせーな。リンクぐらい貼れよ
>>797
929デフォルトの名無しさん:2013/08/20(火) 02:38:59.65
>>912
> アドレス加算演算子とかはどうやっても左にしか書けない
>>923
> 1=*a++とはそりゃかけんわ

???
それってリテラルに代入できないだけだよね?
y = *x++ とは書けるし
930デフォルトの名無しさん:2013/08/20(火) 02:42:08.12
>>929
その場合、*演算子の意味が別物になっとる
cのポインタはこういうところが混乱の元でもあるね
931デフォルトの名無しさん:2013/08/20(火) 02:43:18.13
まあ、確かにリテラルに代入できないだけだよ
x+1に代入できないだけなのと一緒
932デフォルトの名無しさん:2013/08/20(火) 02:46:30.65
*pgr++ = 1

にしてもCにアドレス加算演算子なんてあるんだろうか
ふつうのインクリメント演算子だと思うのだが
933デフォルトの名無しさん:2013/08/20(火) 02:52:16.99
アドレスをインクリメントするから、普通とはちょっと異なるよ
まあ、でも、アドレスも値の一種だとか、よくは知らんが、マジで厳密に
突き詰めれば同じなのかもしれん
ただ、仮にそうだとしても言わんとしてることとは関係あるまい
揚げ足取りの類
934デフォルトの名無しさん:2013/08/20(火) 02:55:24.85
えーと、”無理やり”かけるというのは
自然には書けないとみなします。
935デフォルトの名無しさん:2013/08/20(火) 07:45:37.86
Rだと
1 -> x
x <- 1
936デフォルトの名無しさん:2013/08/20(火) 09:21:46.81
左辺値にはインクリメントとか、当然できんね。
あとキャストにも制限があったっけ?
937デフォルトの名無しさん:2013/08/21(水) 02:56:39.95
アドレスの加算も知らなかった馬鹿は黙ってろよ
938デフォルトの名無しさん:2013/08/21(水) 09:09:53.40
おまえがバカ
939デフォルトの名無しさん:2013/08/21(水) 20:22:07.84
Gets!!! (ほんとにあった怖いコード in jQuery)
http://orgachem.hatenablog.com/entry/2013/08/21/030244

いやーこれはひどいw

> Gets???もう、もう意味が分からないです。いったい何をGetsするんですか。
ソースコード読んでますか?

この関数はコレクションに値をset/getする関数ですよ?ってコメントに書いてますよ?
おなじみの、引数があればsetterとして、なければgetterとする関数です。

上にset valueって書いてあるじゃないですか? getsは当然get valueのことでしょう。
このコードはそもそもvalueを読み書きするもの。汎用的なものなので
具体的なvalueが何かはわからない。だからvalueって書くしかない。
valueの読み書きなのは関数のコメント見りゃわかる。なのでvalueを書くまでもない。
ただ、どの部分がsetでgetなのかはわかりにくいから書く必要がある。

> 引数が7つもある香ばしい仕上がり。Multifunctionalにした結果がこれだよ!

はい全然違います。getとsetを分離した所で、引数の数は変わりません。
むしろ重複コードが増えます。重複させない限り分離できません。
自分ならどうコードを書くか、せめて頭のなかで書いてみましょうね

> これがJSで最も有名なライブラリか……誰か助けて…

こんなくだらない点しか指摘できない。さすが有名なライブラリ。

id:devorgachem えらそうにw
940デフォルトの名無しさん:2013/08/21(水) 20:35:40.51
俺tueeeの香りがぷんぷんしますw
941デフォルトの名無しさん:2013/08/21(水) 20:47:32.70
一般的には、Getsというコメントがあれば、
なんの値を取得しているんだよ!取得する”具体的な値”は何か
ちゃんと書けってつっこみを入れる。

だけどこのコードの場合、汎用的な関数なので取得するのは
"値"としか書けない。値は具体的ではない。

Gets valueと書いた所で、なんの値を取得しているんだよ!ってつっこむ。

そもそもこのコメントが書いてある意味を勘違いしている。
これは ”何を取得しているか” ではなく "何をしているか” を説明するためのコメント

この関数は、汎用的な値を代入、取得するものである。
だから"値"を取得するということは、Getsというコメントを
見るまでもなくわかることである。

わからないのは、どの部分がsetterであり、どの部分がgetterであるかということ。
だから、複数の値のsetter、単一の値のsetter、そしてgetter。
”何を取得しているか” ではなく "何をしているか” それを示したかっただけ。

このブログの人は、Getsというコメントを見て
ソースを読まずに脊髄反射をしただけである。
典型的な初心者を抜けたつもりの初心者
942デフォルトの名無しさん:2013/08/21(水) 21:25:53.01
学生らしいし許してやれよ
https://twitter.com/orga_chem/status/314414450293751810

>>941みたいに丁寧に添削してくれる人が身近にいないと、
いつまでも誤った理解が修正されずに「俺って天才かも」という歪んだ自尊心が育っていく典型例だな
943デフォルトの名無しさん:2013/08/21(水) 22:10:10.99
機能の概要も把握せずにコメントにだけ突っ込んで改善方法すら提示しない
典型的なワナビー
944デフォルトの名無しさん:2013/08/21(水) 22:12:53.96
で、なんでこんなの晒したん?
945デフォルトの名無しさん:2013/08/21(水) 22:42:15.45
>>939
さすが何のコメントも資料もなくても関数の内容を全て把握している天才は違うな、言うことが
946デフォルトの名無しさん:2013/08/21(水) 22:44:02.58
>丁寧に添削してくれる人
え…え?
ネチネチいじめまわしてるように見えるんだが…お前優しいな(自分自身に)
947デフォルトの名無しさん:2013/08/21(水) 22:49:52.27
ていうか本人と全く関係ないところで晒してバカにする行為を「丁寧に添削」とは本人以外の誰も言わないwwww
948デフォルトの名無しさん:2013/08/21(水) 22:53:01.42
>>946-947
日本語苦手そうだな。ここで書き込んでることが丁寧ということではないぞ
949デフォルトの名無しさん:2013/08/21(水) 22:53:50.19
>>946
臭い
950デフォルトの名無しさん:2013/08/21(水) 23:01:16.12
こんな簡単な関数にコメントとか資料とかマジで言ってるとしたら初心者向けの本で勉強し直した方がいい
951デフォルトの名無しさん:2013/08/21(水) 23:23:18.39
簡単ではないだろ
jQuery使ってないとわからん
952デフォルトの名無しさん:2013/08/21(水) 23:25:16.38
>>944
> で、なんでこんなの晒したん?
さっきはてなブックマークでみつけた。

「納涼!ほんとにあった怖いコード」シリーズで
面白く読もうとしてたら、俺の大好きなjQueryを
ディスってたから、速攻ありえないと思ってコード見た。

やつのブログでディスり返すつもりだったが、
匿名で書き込めなかったのでここに晒した。

jQueryはショートコーディングでかいてあるから
多少わかりにくくても、短くしているところはあるんだが、
まったく天下のjQuery様がそんなヘボするわけ無いだろ。

これがJSで最も(略)誰か助けて・・・じゃねーよクソガキが
てめーが未熟なだけだ。


>>945
> さすが何のコメントも資料もなくても関数の内容を全て把握している天才は違うな、言うことが
関数にコメントあるじゃんw その上50行程度の関数

>>946
> ネチネチいじめまわしてるように見えるんだが…お前優しいな(自分自身に)
正解! だから匿名で書き込もうと思ったけど、書けなかったから
ここでネチネチいじめたw
953デフォルトの名無しさん:2013/08/21(水) 23:40:26.79
バカ丸出し
954デフォルトの名無しさん:2013/08/21(水) 23:49:54.75
まあ、こいつよりは明らかにjQueryの作者の方が物事をよく知ってるし、
プログラマとして上だろう
つまり、こいつが指摘してることは、的外れか取るに足らないことだと想像できる
955デフォルトの名無しさん:2013/08/21(水) 23:56:35.94
APIの資料は豊富だし、省コード多機能も用途考えれば当たり前だから
普通は突っ込まないけど、汚いことは汚い

ただ実際のコードの内容やその関数のテストコードが無いことに突っ込まないあたり初々しい
956デフォルトの名無しさん:2013/08/21(水) 23:58:34.15
汚いというのなら、きれいに書きなおしてくれよ。
たった50行だ。

テストコードがないのは当たり前。
なぜならこのコードはプライベートメソッド相当だから。
この関数は内部で使う非公開関数。だからマニュアル化もされていない。
957デフォルトの名無しさん:2013/08/22(木) 00:07:53.93
そういったいろんな言い分や事情を全く知らないまま
指摘してるのは、想像に固くないな
やはり、実績が違いすぎる
958デフォルトの名無しさん:2013/08/22(木) 00:15:17.51
>>956
同じ作者の昔のaccessのコード見てこい低能
959デフォルトの名無しさん:2013/08/22(木) 00:34:46.11
JS厨には三項演算子使いまくりのコードが綺麗に見えるらしい
960デフォルトの名無しさん:2013/08/22(木) 01:04:57.64
>>958
https://github.com/jquery/jquery/blob/1eb1ad616069ab103ceecf48c48514f51dd5d5ac/src/core.js

これか? 昔のコードが書きなおされたのは、
昔のコードに問題があったからなんだけど、
問題が有るコードと比べてなんの意味があるんだ?

俺はきれいに書きなおしてくれといったんだぞ?

綺麗に書き直しました。ただバグがあります。
でも綺麗だからこっちに入れ替えてくださいって
いったらぶち殺されるぞw

>>959
あなたの会社では、三項演算子は禁止ですか?
961デフォルトの名無しさん:2013/08/22(木) 02:05:14.85
今のコードが汚いという話をしてるんだろ。
962デフォルトの名無しさん:2013/08/22(木) 02:07:02.04
だから今のコードを綺麗にしろって話をしてるんだろ?

必要な処理が足りないコードと比較しても
意味が無い。
963デフォルトの名無しさん:2013/08/22(木) 02:16:02.50
何でそんな俺が一銭も得しない事を強要するんだ?
他人のブログほじくり出してきて来るだけあるな。
964デフォルトの名無しさん:2013/08/22(木) 02:18:27.44
> 何でそんな俺が一銭も得しない事を強要するんだ?

お前がコード見て汚いと言ったから
じゃあ汚いというのなら、きれいに書き直せよ
って言われただけだろ?

何逆ギレしてるんだ?

自分の発言に責任をもてってだけだろ。
できなきゃ謝罪しろ。
965デフォルトの名無しさん:2013/08/22(木) 02:20:26.95
あー、これどこかの誰かと自分を同じ立場に置いて見下すタイプのキチガイか。
謝罪要求とか久々に見た。
966デフォルトの名無しさん:2013/08/22(木) 02:23:11.68
話をそらし始めたな。
じゃあ強制的に戻そう。

お前言ったよね?コードが汚いって。
じゃあお前これよりきれいなコードかけるの?
自分ができないことを言うなよ。恥ずかしいやつだ。
967デフォルトの名無しさん:2013/08/22(木) 02:41:19.45
最初に他人のコードをDisった奴は
他人からそれをDisり返されても泣き言言うなってことだな
自分の考えが正しいと思うなら論理的に反論すれば良いと思うよ
なんかモゴモゴ口ごもりながら必死で論点ずらそうとしてる奴らは
関係者かなんかなの?
968デフォルトの名無しさん:2013/08/22(木) 02:42:53.41
> 自分の考えが正しいと思うなら論理的に反論すれば良いと思うよ

まったくだ。

ブログの内容を論理的に指摘した人に
早く汚いといった根拠を示せよ。
969デフォルトの名無しさん:2013/08/22(木) 02:44:09.46
>>966
なんでそうなるんだ?
極力変数宣言端折ってたりする技巧的で複雑なコードなんだから、
読み手からすりゃ汚くて当然だって言ってるだけなんだけど、理解できない?
970デフォルトの名無しさん:2013/08/22(木) 02:46:01.98
「複雑」と「汚い」は意味が違う
複雑は単に複雑なだけ。複雑な書き方が最善な場合もある。
汚いというのは、それよりも綺麗なコードがあるということ

だが、綺麗なコードは示せていない(笑)
971デフォルトの名無しさん:2013/08/22(木) 02:59:37.69
>>970
はいはい一番汚ないところだけな。
http://ideone.com/xQChL3
972デフォルトの名無しさん:2013/08/22(木) 03:11:56.33
たしかにこういう三項演算子のネストはやめたほうがいい
あと走らないコードの run code
973デフォルトの名無しさん:2013/08/22(木) 03:26:24.17
>>971
本当かどうかは知らないが、jQueryがこれでJavaScriptを圧縮してるらしい。

【jQueryコード】76バイト
return chainable?elems:bulk?fn.call(elems):length?fn(elems[0],key):emptyGet;

【お前のコード】129バイト
if(chainable){return elems}else if(bulk){return fn.call(elems)}else if(elem.length){return fn(elems[0],key)}else{return emptyGet}


ここまで考えてなかっただろ?

これは設計方針であって、綺麗汚いとは別の話。
974デフォルトの名無しさん:2013/08/22(木) 03:29:23.26
>>971は汚いな。

returnしてるんだから、elseいらんだろ。

こういうのを汚いという。
975デフォルトの名無しさん:2013/08/22(木) 03:32:09.93
結局やったらやったでこれ。
ま、わかってたけどね。
976デフォルトの名無しさん:2013/08/22(木) 03:33:24.71
そりゃそうだ。

汚いものを綺麗に直せという話なのに、
バイト数増やして劣化させてるじゃねーか。
977デフォルトの名無しさん:2013/08/22(木) 03:33:27.50
汚いというかWEBベースのスクリプト言語の特性を理解してない感じがする
978デフォルトの名無しさん:2013/08/22(木) 03:34:48.41
>>973
何使っったんだよ。
979デフォルトの名無しさん:2013/08/22(木) 03:37:35.37
>>978
ワロタw

書き忘れた。

ついでだからググれwww

しかし、無駄なelseがある汚いコード出されても困るなぁw
980デフォルトの名無しさん:2013/08/22(木) 03:46:02.13
>>979
jQueryが使ってる奴を使うとその手のif文消えるはずなんだけどなあ
一体何を使ったのか後学のために教えてくださいよ
ねえ
981367:2013/08/22(木) 03:51:06.87
>>897
遅くなったがレスありがとう、>>887に挙げた条件をすべてクリアしていると思う
異論はある(>>896)けれど、これをもって「Pythonは式指向の壁を越えている」と判断したい
同様に、(if文を使わず)三項演算子を使った>>613から、「JavaScriptは...(以下略)」としたい

これらについては、>>707の次回更新時に反映させることを約束します


>>906
もともと関数型プログラミングという文脈下でのコード合戦なので、
(for文を使う>>906よりも)関数reduceを使った>>897のほうが望ましいと思われ
982デフォルトの名無しさん:2013/08/22(木) 04:10:29.56
ちなみにjQueryで本当に使われてるはずの物でコンパイルするとこうなる
http://ideone.com/Zqswpw

で、jQueryで使われてるプログラムってなんなんですか?
983デフォルトの名無しさん:2013/08/22(木) 04:13:13.75
PHPだけだろ?
三項演算子がバグってるのは
984デフォルトの名無しさん:2013/08/22(木) 04:15:58.22
JS厨敗走しちゃった?
変な知ったかしなけりゃよかったねw
985デフォルトの名無しさん:2013/08/22(木) 07:24:24.57
こんな簡単な関数にすらドキュメント云々とか言い出すなんて
マジで頭大丈夫か?
プライベート関数にAPI並みのドキュメントを期待する方がどうかしてる
986デフォルトの名無しさん:2013/08/22(木) 13:34:04.27
最悪でもすんなり理解させる程度にはコメント書くだろ。
お前の頭が大丈夫か?
987デフォルトの名無しさん:2013/08/22(木) 17:51:24.11
バカスレw
988デフォルトの名無しさん:2013/08/22(木) 18:10:10.40
>>986
具体的にどこの処理の意味が分からなかったのか行数で「ここからわからなかった」と明示してくれ
989デフォルトの名無しさん:2013/08/22(木) 18:11:24.82
まだやるのかよ?w
990デフォルトの名無しさん:2013/08/22(木) 18:17:40.77
>>989
具体的にどこの処理の意味が難しかったのか行数で「ここからわからなかった」と明示してくれ
本当に難しいコードだったのなら簡単に指摘できるだろ?

さぁ。どこが難しかったのか教えてくれよ
991デフォルトの名無しさん:2013/08/22(木) 19:55:11.99
>>990
bulkの意味答えてみ
あ、あとついでにjQueryで使われてるコード圧縮プログラムもお願いしますね
992デフォルトの名無しさん:2013/08/22(木) 20:13:34.82
いい忘れてたけど圧縮オプション間違えたとか苦しい言い訳辞めてね
jQueryに精通してると主張してる奴がMinifiedコードを見間違えるわけ無いからね
見たこと無いなんてもっとあり得ないし

詭弁のためにわざと低圧縮にしましたと認めるなら許す
993デフォルトの名無しさん:2013/08/22(木) 20:18:43.72
       -‐''''"´ ̄``ヽ、              ____
       /     _     ヽ        //´   __,,>、
     /        ̄ ̄   {        /::/ / ̄:::::::::::::::\
      l _ィニニア二二二ニヽ、j._      /::::l/::::::::::::::::::::::::::::::::l
     | 0Lj/-‐-レノ ノ_ヽ:::`ヽ     l:::::::::::/l/lノノ/_イ:::::l
     レ:r、/ イ゚テ   ピト`|::|      l:::::::::/ rtテ、  .ィtq l::::::|
      l:lヘ  '"   ,j  '"/ノ      |::lヘ!j  ´  ,j   !;:::/
     ヽヽ、   r‐-,   /'         レリー 、    ,....,  lノ/
        lヽ、  ̄ /         `ヽ、lヽ 、  ̄ /´
     _,r┴‐-`v´-‐j-、__   , -‐-、_r┴─'ー‐チト       バルク!!
  / ̄/:.:.:.:| ̄ ̄`T ̄´|:.:.:.:l´ `ヽ /    ヽ ̄`ー-‐'´`''''⌒ヽ
/   ,':.:.:.:.:.l    l   l:.:.:.l    \  _r‐、-、-、r,    、   ',
     |:.:.:.:.:.:.!     !   !:.:.l   ,. -‐ゝ/// 〉 〉 〉 〉 〉    !   ',
    l:.:.:.:.:.:.l     |   l:.:.:l  /  人〈〈〈〈 ' ' ' /っ   l    l
    l:.:.:.:.:.:.!     !   l:.:.:.ト/   /  ```´-ァ‐'''"     /   l
、__/:.:.:.:.:.:l     |    |:.:.:ヽヘ  l    //         / _ ィノ
    /:.:.:.:.:.:.:!    l   |:.:.:.:.:l `ーヽ、_ノ´l、______/lニ二」
____l:.:.:.:.:.:.:.|      l   |:.:.:.:.:!        |_  ( ( ) )_〕|   l
   l`ー‐‐'匸二l ̄ ̄l二フーイ       /   ̄ `‐‐'´ ヽ  |
994デフォルトの名無しさん:2013/08/22(木) 21:05:21.31
>>992

http://ideone.com/xQChL3

そもそもこれがバグっていただけ。
995デフォルトの名無しさん:2013/08/22(木) 21:08:20.65
>>991
コードに書いてあるコメント

Bulk operations run against the entire set

↓Google翻訳

一括操作は、セット全体に対して実行


bulkの意味ですか? 一括操作の一括なのでは?
996デフォルトの名無しさん:2013/08/22(木) 21:26:56.86
それはバッチじゃね?
バルクってバラ積みだろ
997デフォルトの名無しさん:2013/08/22(木) 21:28:54.83
>>995
その変数が格納しているものと名前の関係を教えてくださいな
特に別の型の変数を代入して使いまわしている事について

俺はそういう事するのは汚いコードだと思うんだけど
いくら言っても汚くない綺麗だって言うからさ
998デフォルトの名無しさん:2013/08/22(木) 21:29:08.30
大量

in bulk
(1)ばら荷で,包装しないで.
(2)大口で,大量に:
999デフォルトの名無しさん:2013/08/22(木) 21:30:39.97
>>994
http://ideone.com/Zqswpw
で、jQueryで使われてる圧縮プログラムってなんなんですか?
早く答えてくださいよw知ったかぶりなんですかあー?
1000デフォルトの名無しさん:2013/08/22(木) 21:33:41.51
具体的に指摘しても結局答えられないんですねw
ええわかってましたけどw
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。