X



最も美しいプログラミング言語は? Part6

■ このスレッドは過去ログ倉庫に格納されています
0267デフォルトの名無しさん
垢版 |
2011/07/06(水) 20:14:58.09
>>266
実装は別に大変じゃないよ
そこら中の LL が持ってる機能だからね
スコープで混乱している人も見掛けないし
Python の lambda みたいに中途半端な物を有り難がる必要も無い


結局、具体例は無しか
ソースコードの一つでも出て来るかと期待したのが間違いだったかな
0268デフォルトの名無しさん
垢版 |
2011/07/06(水) 20:27:12.23
まあ Python の場合は、インデントしないとブロックが作れないという妙な制約の所為で、
クロージャの構文を考えるのが面倒くさかったのかもな
0269デフォルトの名無しさん
垢版 |
2011/07/06(水) 22:26:09.36
やっぱコレぐらいの機能を持ってないとダメだろ
・文脈構造が黒髪ツーサドアップ
・関数リストの定義がミニスカニーソ
・インターフェースが童顔
・Foundationは薄化粧
・研究所で開発されてた頃のあだ名が猫
0270デフォルトの名無しさん
垢版 |
2011/07/06(水) 22:32:26.74
趣味が幼稚だよね。
ていうか汚らしい。
(倫理的に不潔という意味でなく文字通り細菌的に不衛生という意味)
0271デフォルトの名無しさん
垢版 |
2011/07/07(木) 04:49:25.74
>>267
要らないといっているのに、ソースコードを張れって意味フ。Python では、書けないコードを出して。
クロージャーは、巨大になってくるとGloal変数と同じ問題あり。Pythonは、うまく対処している。
実装は面倒。克服しているだけの話。妙な制限があるのもその都合。
0272デフォルトの名無しさん
垢版 |
2011/07/07(木) 09:18:55.25
>>271
>クロージャーは、巨大になってくるとGloal変数と同じ問題あり。
>実装は面倒。

だからさ、もっと具体的に書こうぜ。
Global 変数と同じ『どんな』問題があると思うの?
実装が面倒だったら、世の中にあまたある Lisp の処理系はどんな超絶技巧を使っているというの?

きちんと理由を書かないと話にならないぜ。
0273デフォルトの名無しさん
垢版 |
2011/07/07(木) 09:27:35.16
もちろん Lisp の所は Smalltalk と読み替えても良いし、JS でも良いし、他の LL でも良いよ。
クロージャなんて殆どどこにでもあるありふれた機能で、有って当たり前の物。
0276デフォルトの名無しさん
垢版 |
2011/07/07(木) 09:37:20.77
Zen of Python とか言いながら、メソッド定義に毎回 self を書かせる素敵仕様な
言語になっちゃうんだもんなあw
0279デフォルトの名無しさん
垢版 |
2011/07/07(木) 10:33:10.77
Python にクロージャが無いのはオフサイドルールの犠牲になったんだと思うわ。

クロージャはデータだから、引数の位置や代入分の右辺の位置でも定義可能にしないと
いけない訳だけど、Python ではそれらの位置にブロックを書かせる(=インデントを
書かせる)のは都合が悪い。関数の 3 番目の引数からインデントが始まるコードなんて
誰も読みたくないからね。

インデントが強制されない、他の言語では何の問題も無い話だけどね。
0280デフォルトの名無しさん
垢版 |
2011/07/07(木) 10:58:47.18
クロージャに(lambdaに)文が書けないのは、だろうけど、
別にそこだけHaskellの { ; } みたいな構文を導入してもいいわけだし、
説得力ないと思うなぁ。
0281デフォルトの名無しさん
垢版 |
2011/07/07(木) 11:36:45.19
>>278
実装が面倒だったのではなく、インスタンスメソッドを特別扱いしたくなかっただけ
関数とメソッドを一貫性のある形で扱うことを選んだのと、
デコレータがある場合にselfの省略に問題があることが>>277で議論されてるだろ

>>279
ちゃんと>>274のリンク先を読んだ?従来の lambda と後方互換性がある形式で
multi-statement lambda へ拡張できる方法があると議論されてる

簡潔に言えば、理由は「Guidoの好み」だ
0283デフォルトの名無しさん
垢版 |
2011/07/07(木) 11:56:01.88
まあ、俺もPythonが美しいとは思わないし、selfはともかく
multi-statement lambda は在った方が良いと思うけどさ
そうなってる理由が実装が面倒とかいう理由では無いと言いたい
0284デフォルトの名無しさん
垢版 |
2011/07/07(木) 21:28:21.12
>>281
でも、lambda についての議論の結果がこれでしょ

http://mail.python.org/pipermail/python-dev/2006-February/060654.html

括弧でブロックを表す事が受け入れられるなら、
最初からオフサイドルールの強制なんてしない訳で、
非現実的な提案なんじゃないかな?

Python 的に受け入れ可能な文法でクロージャを
組み入れるのは、無理な話だと思うよ

>>280
『そこだけ変えれば良い』というのが受け入れられる
文化じゃないでしょ
0285デフォルトの名無しさん
垢版 |
2011/07/07(木) 22:12:51.14
>>284
> オフサイドルール
これが最悪なんですよ.
手続き書き換えてて途中に判定分入った場合エディタまかせにできない
0286デフォルトの名無しさん
垢版 |
2011/07/08(金) 01:27:40.15
>>251
何を言っているんだろう?

Lazy Kの一貫性は完璧であり、その意味ではもっとも美しい言語だろう。
Lazy K以上に簡明で一貫した意味論、構文を持つ言語を考えるのは難しい。
それが分からないようじゃ、「関数型言語はそもそも一貫性?が無い」とは、何も分かっていないんだろうなとしか思えん。

> クロージャーは、巨大になってくるとGloal変数と同じ問題あり。

たぶん、LISPなどの非純粋型言語のクロージャを考えているんだろう。
たしかに、そういった言語のクロージャは、グローバル変数と同じというかCのスタティック変数と同じように、ライブラリ使用者から隠された変数によって関数の挙動が変わる、という問題がある。
しかし、じゃぁ、いかなる意味でもグローバルな識別子が存在しないか、あるいはグローバルな識別子を使用したどの関数呼び出しも、決して隠されたパラメータによって関数の挙動が変わることがない、ということが保障された言語なんでどれほどある?
(オレが思いつきかぎりでは、Lazy Kしか存在しない。)

クロージャよりも、クラスメソッドやクラス変数のほうが理解しやすい、混乱しにくいというのならそういう頭の人もいるだろうから、個人の好みの問題といしては否定はしない。
でも、それは好みの問題に過ぎない。
0287デフォルトの名無しさん
垢版 |
2011/07/08(金) 01:53:34.89
JavaScript はかなり美しいな

全てはオブジェクトだよ
全てはハッシュだよ

Smalltalk もかなり美しいな

全てはオブジェクトだよ
全てはメッセージだよ

Lisp もかなり美しい

全てはリストだよ
全てはラムダだよ

もちろん例外もあるので、異論は好きなだけどうぞ
0289デフォルトの名無しさん
垢版 |
2011/07/08(金) 02:10:48.84
美しいかどうかは置いといて、BASICからプログラミングへ入れたのは良い時代だったな
0290デフォルトの名無しさん
垢版 |
2011/07/08(金) 04:30:17.92
>>287
「現実の」「実践的な」JavaScriptのコードを見たうえで美しいとか言ってるの?
それとも言語の設計思想のことを言ってるの?
前者だとしたら、お前100年遅れてるわ
0294デフォルトの名無しさん
垢版 |
2011/07/08(金) 09:33:19.56
JavaScriptはvar宣言はあるけど関数スコープだったり
for〜inループやthisの扱いがちょっと好きじゃないな
同じ系統だとJavaScriptよりはLuaのほうがまだすっきりしてるように見える
0295デフォルトの名無しさん
垢版 |
2011/07/08(金) 17:11:34.93
>>294
JavaScriptのthisは動的スコープだからな。

動的スコープありやなしや、結構むずかしい問題。
オレは静的スコープ脳だけど、Lispとかで動的スコープを使ったトリックをみると、なるほどなーと思う。
0296デフォルトの名無しさん
垢版 |
2011/07/08(金) 18:20:34.10
毎回 var self = this; を書くのはあんまり美しくはないよね
クラスにあたる存在とメソッドにあたる存在の区別が付かないのに
その1行で何とかなっちゃうように出来てるのは凄いんだけど
0299デフォルトの名無しさん
垢版 |
2011/07/08(金) 19:53:27.69
>>298
個人的な好みの問題といわれるとそれまでだけど
ブロックスコープの代用として
(function(){})()
みたいなのが多用されるのを見ると、ちょっとな……
まあ他にもletとかwithとか色々あるみたいだが、
それなら最初からブロックスコープのほうがナンボかいいと俺は思う

0300デフォルトの名無しさん
垢版 |
2011/07/08(金) 20:02:37.23
>>299
JavaScript は Scheme と同じで、削ぎ落とした所が良いんだと思う

object で scope が代用できるなら object だけでいいし、
本質的には block scope は単なる syntax sugar でしょ
0301デフォルトの名無しさん
垢版 |
2011/07/08(金) 20:07:39.36
>>300
letがただのlambdaのsyntax sugarだとしても
Lisp族はマクロでletを作れるので、実用上の視点からは
Schemeとは一緒にできないような気がする
…んだけど、スレタイからするとあまり関係の無い視点のような気はしてきた

確かに言語の美しさとは関係が無いのかもしれない
0302デフォルトの名無しさん
垢版 |
2011/07/08(金) 20:16:12.17
>>301
そこは、JS にはマクロの様な構文を拡張する機能が無い、
だから let を(新たに)用意したって事なんじゃないかな

元々 block scope にしておけば良かったかというと、
それでは JavaScript らしくないんじゃないかなと思う
0303デフォルトの名無しさん
垢版 |
2011/07/08(金) 20:22:04.65
> 元々 block scope にしておけば良かったかというと、
> それでは JavaScript らしくないんじゃないかなと思う

これはとくにそうは思わない、かなあ
わりとJSに似たところの多いLuaはブロックスコープだし
0305デフォルトの名無しさん
垢版 |
2011/07/08(金) 20:32:28.63
要は、「ブロックスコープでJSらしさが欠損する」理由が俺には見えないってことね
letを後から入れるぐらいなら、simplicityも絶対の理由ではない気がするし
0306デフォルトの名無しさん
垢版 |
2011/07/08(金) 20:34:05.12
うまくいえないけど
letにはPythonのnonlocalのような後付感、蛇足感がつきまとうっていうか……
0307デフォルトの名無しさん
垢版 |
2011/07/08(金) 20:39:51.02
>>305
元々、オブジェクトを唯一の道具立てとして言語を組み立てたのが JS で、
スコープというか環境フレームもオブジェクトで実装するのが自然だよね
というのが俺の理解

let は元々プラン外だったんだから蛇足に見えて当たり前
0308デフォルトの名無しさん
垢版 |
2011/07/10(日) 04:44:23.75
MIPS が美しいって言うよね
いつか試してみたいなあ
0310デフォルトの名無しさん
垢版 |
2011/07/10(日) 13:57:23.65
>>309
haskellより、やることが制限されて簡潔で
lispのようにS式まみれにならず、
容易にバックトラックやエキスパートシステムを実現できる
優れた言語じゃないか
演習でしか使ったことないけど
0311デフォルトの名無しさん
垢版 |
2011/07/16(土) 22:35:02.38
美しくない言語は幾らでも挙げられるけど、美しい言語となると難しいな
0312デフォルトの名無しさん
垢版 |
2011/07/16(土) 23:15:52.99
prologはプログラミングしてるってより、データベース作ってる気分になる。。。
haskellベースに論理型言語を足したcurry

もしくは、prologベースに関数型言語を足したmars辺りは美しいんかね?
0313デフォルトの名無しさん
垢版 |
2011/07/24(日) 03:40:58.69
関数スコープなのって、実装が簡単だからでしょ。
関数スコープで十分だとかって言うのは、酸っぱいブドウ。
ブロックスコープに越したことはない。
0315デフォルトの名無しさん
垢版 |
2011/10/12(水) 01:49:49.75
手続き型はobjective-cが綺麗
cはオブジェクト指向が使えん。汎用的なコレクションライブラリがない
c++は山ほどのドキュメントを読まないと怖くてSTLすら使えない。cとの中途半端な互換性
javaは命名規則が長い。オペレータをオーバーロードできない。プロパティがない。GUIが発展しない
c#はネストが深い。ヘッダが読めん。ポインタ使い辛い
0318デフォルトの名無しさん
垢版 |
2011/11/06(日) 22:08:51.60
>>299
ブロックスコープ使うならwithが綺麗。
with({ a: 1, b: 0})
{
  b = a++; //withで宣言したラベルを使う
}
//ここでaとb消滅
0319318
垢版 |
2011/11/06(日) 22:12:15.02
早とちりした。ごめん。なんでもない。
0320uy
垢版 |
2012/01/26(木) 12:02:06.30
>>315
C++べつに使えるよ
自分が覚えにくい&挙動が不審な部分は絶対に触らないようにしていけばいいだけ
複数人で組む場合は知らない。そもそもそれはC++に想定された使い方ではないと思う

あとobjective-cはゴミ
あんなゴミは見たことない


そういや神オブジェクトって奴いたなぁと思ってみにきたが
死んだのか?

大言はいてたわりにはあっさりと消えたな

見た目が綺麗なのはPythonかLispだろうな


ただ俺はRubyのソースコードのほうが自分の中で思考がまとめやすいってだけかな
キチガイに刃物ってこういうことだと思う

rubyはuyに持たせてはいけない刃物だったんじゃないかと最近思う
俺がかくrubyコードとネットにあがるrubyコードって質がまず違うよね、何故俺にはここまでrubyが使えるのだろう
Matzには本当に感謝をしている、rubyがなければ自分が何年間もかけて言語を作らなければならなくなった
俺が何年間もかけて言語を作っていたはずの、その時間で俺は別のことをやれる
とてもこれは感謝以外に何ものでもないよ
0323uy
垢版 |
2012/01/26(木) 20:43:06.69
>>322
礼をいうべきか否か
リンクたどっていったら冗談きついくらいのヒゲ画像と本名が出てきて
さらにググったら京都大学スレでも晒されてるし涙でてきた

とりあえず、なんか技術者としては平凡以下に収まってしまったようだな
Rubyプログラミング関数型プログラミングって3年前も同じことを言ってるの見たわ
この3年間何やってた。。

少しは期待していたのに化ける事がなかった残念
やっぱりJAVAなんて使っているから・・・
0324uy
垢版 |
2012/01/26(木) 20:50:30.90
>>321
誰へのレスかと思ったら俺へのレスか
俺が1日中2chしかやっていないと思っているのだろうか?
書き込み数はコテハンだから多く見えるだけ
0325uy
垢版 |
2012/01/26(木) 21:02:57.09
神オブジェクトはでもRubyに興味持ち始めたんだったら、
まだ救う価値はある
どうせあの手のタイプはPython側に行くのはなんとなくわかるけどね
小手先の技術が必要になるようなCやperl等での
手続き型プログラミングのロジックや小さく圧縮されたショートコーディングのようなものは絶対かけないから
rubyはきっと向いていないだろう
自分でrubyはかけても他人のrubyコードが読めないとか前言ってたのは、おそらくそれのせい。
俺にとってはどんなrubyコードでも読みやすいけど
奴はPythonに収まるだろうな
0328uy
垢版 |
2012/01/27(金) 08:27:34.60
ああ、大学楽しそうでいいな
0329デフォルトの名無しさん
垢版 |
2012/08/06(月) 20:52:03.54
学校でSchemeを勉強して以来Schemeが好きになった。
括弧の多さなんて気にならない。
見た目はそんなに美しいってわけでもないけど、
非常に書きよい、心地よい。
0330uy
垢版 |
2012/08/08(水) 10:49:00.43
汚いのは英数字と記号だからね

文字のすべてが
・ ― |  ■ あたりで構成されていれば綺麗だよ
0332デフォルトの名無しさん
垢版 |
2012/09/15(土) 17:05:12.35
ランク付けは要らないが、各言語の「考え方」と「記法」を区別してスマートさの得失整理するのは有意義。
0333uy
垢版 |
2012/09/15(土) 20:53:59.98
パールパイソンルビーには特色があって
開発者のやりたかったことも伝わってくるけど
PHPやJSにはそれがないんだ
主張のようなものを何も感じない
ただのなんのへんてつもない言語A、言語Bって感じ
あとC#にも主張がなにもないな
C++にはかなりある
javaには少しある


俺様にとってプログラミングは道具ではなく一般的じゃない変な方法を探し出しその上で効率よく目的を達成するゲームだから
言語に癖がないとさ
プレイする価値のないクソゲなんだよ
0335uy
垢版 |
2012/09/16(日) 00:28:01.37
誰も聞いてない
0336デフォルトの名無しさん
垢版 |
2012/09/16(日) 05:32:18.88
Prologは極めて美しくもなるし、醜悪に書くこともできる。
自在性のプログラム言語。
0337デフォルトの名無しさん
垢版 |
2012/09/16(日) 14:54:40.27
>>333 まぁ、分類としては概ね同意するよ。
perl/php/JS あたりは、そもそもが綺麗なプログラミング言語を作ろう、というのが主目的で作られたものじゃないから。JS はそれでもよくできているが。
0338デフォルトの名無しさん
垢版 |
2012/09/16(日) 15:03:41.95
c#は、javaとc++の失敗から学んで生まれた実践から出来た言語だよ。
jsとrubyも同じようなもの
perlとPHPがユーザーのニーズから後付で膨れて失敗したか、失敗しそうな言語
c++は、どっちかっていうとアカデミックな立ち位置から生まれ、
速度といった十字架を背負った唯一無二のソフトウェアを書くための言語
0340デフォルトの名無しさん
垢版 |
2012/09/16(日) 21:11:00.14
美しいというのは基準が酷く漠然としているが
長いプログラマー経験から思う、一般的に美しい
プログラムと言われやすい書き方の特徴を挙げてみよう。
1.変数名、関数名が極端に長くならず、かつほぼ一定の長さで揃えられている
 おおむね8-10文字である事が多い。
2.変数名や関数名に大文字が使われることはなく、連続した単語の
 結合にはアンダーバーが使われる。
3.大部分の関数の定義は50行以下で、main関数のような中心的な
 処理のみ100行を少し超えるくらいである
4.間延びした印象になる空白行は避けられ、if分の開始ブレースは
ifキーワードと同じ行に書かれる
例:
if(user_id < 10){
以下の書き方は避けられる
if(user_id < 10)
{
5.カラム数が80桁を超えることは無い
6.インデントが揃っているのは当然であるか、字下げが3段以上深くなるようなことは無い。
 それを誇示するようにエディターのTABを8文字に設定する古参プログラマーも多い
7. 関数のヘッダー部分のコメントは一貫した書式で清書され
 SCCSで装飾されていることで格調が高くなる。

はっきり言えば、上記は古い環境の制限から仕方なくおこなわれてきた物が多く
現代の環境では全く推奨されるべき物では無い。しかし、経験の積んだエンジニアは
古い慣習を引きずっていることが多いし、それをお手本として学ぶ事になる場合が多い



0341デフォルトの名無しさん
垢版 |
2012/09/16(日) 22:08:19.31
まぁ、80桁超えないように書くのは今のモニタだとむしろ読みにくいかもしれんね。
0342デフォルトの名無しさん
垢版 |
2012/09/19(水) 10:36:46.74
オブジェクト指向言語は一体にゴツくて美しいとはいえない。
しかし、主流ではあるし、このクラスは独自に美しさを競うべきではないか。
0343uy
垢版 |
2012/09/20(木) 04:57:08.53
lispは勝ち抜けとして考えると次点はpython
閉じ括弧はソースリーディング時にはいらないんだよ
でもコーディング時には必要
0344デフォルトの名無しさん
垢版 |
2012/09/20(木) 08:30:18.57
Haskellは数式だし、Prologは論理式。
姿は美しいが、実は、先にモデルがあって、記号を入れ替えただけ。
独創性は感じられない。
0346デフォルトの名無しさん
垢版 |
2012/09/20(木) 11:40:52.90
美しいという定義が何なのかによる。
可読性なのか、コード量が少なさなのか、それは人それぞれだ。

C#は読みやすくて好きだけど、
WPFで使うラムダ演算子とか見ると、読みにくくてきたねーと思う。

PHPは標準関数の名前がグダグタで汚いと思うけど
シンプルに書けるところは綺麗だと思う。

C言語は好きなんだけど、標準じゃ文字列とか解放とか面倒で、色々ライブラリ入れるんだけど、
入れたライブラリを作った人のセンスがマチマチで、何というか関数名の統一の無さが気に入らない。
0348デフォルトの名無しさん
垢版 |
2012/09/20(木) 12:28:14.46
>>347
Prologは今日では学術的の方に分類されるだろうがカットは実用的な要請によって
使われて見苦しくなっている
0351デフォルトの名無しさん
垢版 |
2012/09/21(金) 23:05:15.92
assert,retractでグローバル変数定義なんて糞だと思った
1年ぐらい演習と講義でオタクな準教授から教わったけれども、
現実世界のどこで使われてるのかがわからないし、使いこなすには1年の講義なんて時間は短すぎた。
はっきりいっておく。古典AIなら動的言語で実装した方がマシである。
0352uy
垢版 |
2012/09/22(土) 00:24:10.61
そんなの調べりゃ5分でわかること
AIに関わらずそれ何も出来ないよ
0353デフォルトの名無しさん
垢版 |
2012/09/22(土) 03:33:04.97
assert,retractはグローバル変数ではなく、述語定義(デーベース定義)だし、
Prologは動的言語だ。それにPrologは4時間で使えるようになるよ。
0354デフォルトの名無しさん
垢版 |
2012/09/22(土) 03:48:02.70
>>353
(データベース定義)ねw
理解するには4時間で十分だが、典型的なプログラムのパターンを知らないと、
書けないね。
0356デフォルトの名無しさん
垢版 |
2012/09/22(土) 07:05:17.23
>>350
一度全部リストの読み上げて、というようなことを許せる人にとっては、
十分に美しいよ。プログラムパターンもプログラム言語の中で最少だろうし。
0357デフォルトの名無しさん
垢版 |
2012/09/22(土) 07:17:11.75
>>356
リストに読み上げてとは、findallで節から引数のリストに変更することかな?
それともファイルからの入力を全て一度リストに取り込むこと?
0359デフォルトの名無しさん
垢版 |
2012/09/22(土) 18:00:12.88
>>353
4時間で扱えるって、せいぜいサザエさん課題ぐらいの問題じゃないか
ビッグマウスもほどほどにしろよ。それともΣプロジェクトに加わった人?
大手って、これで自然言語処理だったり仕様記述してたりするのかしら
0360デフォルトの名無しさん
垢版 |
2012/09/22(土) 20:17:01.96
>>359
そんなこといってもPrologの講習会はほとんどが2+2の4時間だよ
教えることとしてはそれで十分 あとは受講者が工夫する
0361デフォルトの名無しさん
垢版 |
2012/09/22(土) 20:27:54.52
Prologは
オブジェクト、クラスはもちろん 型、ブロック、スコープ、マクロ、クロージャ、遅延評価、
グローバル変数、ローカル変数、議論の対象となる概念のほとんどと無縁
極論すれば、IF文もループもない 教えることなんてほとんどない
append/3が理解できたらおわり
0362uy
垢版 |
2012/09/23(日) 05:49:44.79
関数型厨がλあればなんでもできるとかほざいてるのと一緒で
本当に意味がないんだよそれw

ようはどんな方法でもいいから0と1が表現できたらすべて表現可能

つまりですね

「変数宣言する。変数宣言しない」

01表現できてるよな
これですべてのプログラム組めるよ

こんなことはとっくにわかってんだから
今更珍しがる事とかなんにもないんだよwwwwwwwwwwwwwww
0365デフォルトの名無しさん
垢版 |
2012/09/24(月) 05:47:28.86
Prologは単一化とバックトラックを再帰の枠の中で理解することが必要。
囲碁のルールよりは少し複雑というレベルの一人ゲームのようなもの。
初心者向きの課題を考えて少しずつ「強く」なっていく以外にない。

他言語の重要な構成要素のものでPrologにはないというものがあり、
例えば配列だが、これを用いているアルゴリズムはリストに置き換える
必要がある。そういう時のための情報は外部サイトにほとんどないから
これも自分で考える。
一般に最初から難しい課題が与えられる傾向にあり、これがPrologの
難しさの原因。初心者に初段の課題をやらせても実力向上にはならない。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況