最も美しいプログラミング言語は? Part6
■ このスレッドは過去ログ倉庫に格納されています
>>266 実装は別に大変じゃないよ そこら中の LL が持ってる機能だからね スコープで混乱している人も見掛けないし Python の lambda みたいに中途半端な物を有り難がる必要も無い 結局、具体例は無しか ソースコードの一つでも出て来るかと期待したのが間違いだったかな まあ Python の場合は、インデントしないとブロックが作れないという妙な制約の所為で、 クロージャの構文を考えるのが面倒くさかったのかもな やっぱコレぐらいの機能を持ってないとダメだろ ・文脈構造が黒髪ツーサドアップ ・関数リストの定義がミニスカニーソ ・インターフェースが童顔 ・Foundationは薄化粧 ・研究所で開発されてた頃のあだ名が猫 趣味が幼稚だよね。 ていうか汚らしい。 (倫理的に不潔という意味でなく文字通り細菌的に不衛生という意味) >>267 要らないといっているのに、ソースコードを張れって意味フ。Python では、書けないコードを出して。 クロージャーは、巨大になってくるとGloal変数と同じ問題あり。Pythonは、うまく対処している。 実装は面倒。克服しているだけの話。妙な制限があるのもその都合。 >>271 >クロージャーは、巨大になってくるとGloal変数と同じ問題あり。 >実装は面倒。 だからさ、もっと具体的に書こうぜ。 Global 変数と同じ『どんな』問題があると思うの? 実装が面倒だったら、世の中にあまたある Lisp の処理系はどんな超絶技巧を使っているというの? きちんと理由を書かないと話にならないぜ。 もちろん Lisp の所は Smalltalk と読み替えても良いし、JS でも良いし、他の LL でも良いよ。 クロージャなんて殆どどこにでもあるありふれた機能で、有って当たり前の物。 つーか、Pythonでも multi-statement lambda を実装しようと思えば出来た Guidoが実装しないことを選んだだけ http://www.artima.com/weblogs/viewpost.jsp?thread=147358 Zen of Python とか言いながら、メソッド定義に毎回 self を書かせる素敵仕様な 言語になっちゃうんだもんなあw >>277 構文解析で関数定義とメソッド定義の場合分けするのが面倒だったからだろ Python にクロージャが無いのはオフサイドルールの犠牲になったんだと思うわ。 クロージャはデータだから、引数の位置や代入分の右辺の位置でも定義可能にしないと いけない訳だけど、Python ではそれらの位置にブロックを書かせる(=インデントを 書かせる)のは都合が悪い。関数の 3 番目の引数からインデントが始まるコードなんて 誰も読みたくないからね。 インデントが強制されない、他の言語では何の問題も無い話だけどね。 クロージャに(lambdaに)文が書けないのは、だろうけど、 別にそこだけHaskellの { ; } みたいな構文を導入してもいいわけだし、 説得力ないと思うなぁ。 >>278 実装が面倒だったのではなく、インスタンスメソッドを特別扱いしたくなかっただけ 関数とメソッドを一貫性のある形で扱うことを選んだのと、 デコレータがある場合にselfの省略に問題があることが>>277 で議論されてるだろ >>279 ちゃんと>>274 のリンク先を読んだ?従来の lambda と後方互換性がある形式で multi-statement lambda へ拡張できる方法があると議論されてる 簡潔に言えば、理由は「Guidoの好み」だ まあ、俺もPythonが美しいとは思わないし、selfはともかく multi-statement lambda は在った方が良いと思うけどさ そうなってる理由が実装が面倒とかいう理由では無いと言いたい >>281 でも、lambda についての議論の結果がこれでしょ http://mail.python.org/pipermail/python-dev/2006-February/060654.html 括弧でブロックを表す事が受け入れられるなら、 最初からオフサイドルールの強制なんてしない訳で、 非現実的な提案なんじゃないかな? Python 的に受け入れ可能な文法でクロージャを 組み入れるのは、無理な話だと思うよ >>280 『そこだけ変えれば良い』というのが受け入れられる 文化じゃないでしょ >>284 > オフサイドルール これが最悪なんですよ. 手続き書き換えてて途中に判定分入った場合エディタまかせにできない >>251 何を言っているんだろう? Lazy Kの一貫性は完璧であり、その意味ではもっとも美しい言語だろう。 Lazy K以上に簡明で一貫した意味論、構文を持つ言語を考えるのは難しい。 それが分からないようじゃ、「関数型言語はそもそも一貫性?が無い」とは、何も分かっていないんだろうなとしか思えん。 > クロージャーは、巨大になってくるとGloal変数と同じ問題あり。 たぶん、LISPなどの非純粋型言語のクロージャを考えているんだろう。 たしかに、そういった言語のクロージャは、グローバル変数と同じというかCのスタティック変数と同じように、ライブラリ使用者から隠された変数によって関数の挙動が変わる、という問題がある。 しかし、じゃぁ、いかなる意味でもグローバルな識別子が存在しないか、あるいはグローバルな識別子を使用したどの関数呼び出しも、決して隠されたパラメータによって関数の挙動が変わることがない、ということが保障された言語なんでどれほどある? (オレが思いつきかぎりでは、Lazy Kしか存在しない。) クロージャよりも、クラスメソッドやクラス変数のほうが理解しやすい、混乱しにくいというのならそういう頭の人もいるだろうから、個人の好みの問題といしては否定はしない。 でも、それは好みの問題に過ぎない。 JavaScript はかなり美しいな 全てはオブジェクトだよ 全てはハッシュだよ Smalltalk もかなり美しいな 全てはオブジェクトだよ 全てはメッセージだよ Lisp もかなり美しい 全てはリストだよ 全てはラムダだよ もちろん例外もあるので、異論は好きなだけどうぞ ブログでやれ そして、自分で言語(の仕様)を作れといいたい 美しいかどうかは置いといて、BASICからプログラミングへ入れたのは良い時代だったな >>287 「現実の」「実践的な」JavaScriptのコードを見たうえで美しいとか言ってるの? それとも言語の設計思想のことを言ってるの? 前者だとしたら、お前100年遅れてるわ >>289 BASICから入ると一生プログラマになれない、と言われてた時代が懐かしいな。 >>290 >>287 のレスの中身を見てそれが判別できないなら、100年進んでいても意味無いなw ご苦労なこった どう見ても判別できると思えませんが ご苦労な脳味噌はおまえだろw JavaScriptはvar宣言はあるけど関数スコープだったり for〜inループやthisの扱いがちょっと好きじゃないな 同じ系統だとJavaScriptよりはLuaのほうがまだすっきりしてるように見える >>294 JavaScriptのthisは動的スコープだからな。 動的スコープありやなしや、結構むずかしい問題。 オレは静的スコープ脳だけど、Lispとかで動的スコープを使ったトリックをみると、なるほどなーと思う。 毎回 var self = this; を書くのはあんまり美しくはないよね クラスにあたる存在とメソッドにあたる存在の区別が付かないのに その1行で何とかなっちゃうように出来てるのは凄いんだけど >>293 君が判別できないだけ 面倒くさいから、下らない事で突っかかってくるなよ >>294 >関数スコープ lexical addressing が lambda 単位なのはスッキリしてていいと思うけど >>298 個人的な好みの問題といわれるとそれまでだけど ブロックスコープの代用として (function(){})() みたいなのが多用されるのを見ると、ちょっとな…… まあ他にもletとかwithとか色々あるみたいだが、 それなら最初からブロックスコープのほうがナンボかいいと俺は思う >>299 JavaScript は Scheme と同じで、削ぎ落とした所が良いんだと思う object で scope が代用できるなら object だけでいいし、 本質的には block scope は単なる syntax sugar でしょ >>300 letがただのlambdaのsyntax sugarだとしても Lisp族はマクロでletを作れるので、実用上の視点からは Schemeとは一緒にできないような気がする …んだけど、スレタイからするとあまり関係の無い視点のような気はしてきた 確かに言語の美しさとは関係が無いのかもしれない >>301 そこは、JS にはマクロの様な構文を拡張する機能が無い、 だから let を(新たに)用意したって事なんじゃないかな 元々 block scope にしておけば良かったかというと、 それでは JavaScript らしくないんじゃないかなと思う > 元々 block scope にしておけば良かったかというと、 > それでは JavaScript らしくないんじゃないかなと思う これはとくにそうは思わない、かなあ わりとJSに似たところの多いLuaはブロックスコープだし 要は、「ブロックスコープでJSらしさが欠損する」理由が俺には見えないってことね letを後から入れるぐらいなら、simplicityも絶対の理由ではない気がするし うまくいえないけど letにはPythonのnonlocalのような後付感、蛇足感がつきまとうっていうか…… >>305 元々、オブジェクトを唯一の道具立てとして言語を組み立てたのが JS で、 スコープというか環境フレームもオブジェクトで実装するのが自然だよね というのが俺の理解 let は元々プラン外だったんだから蛇足に見えて当たり前 MIPS が美しいって言うよね いつか試してみたいなあ >>258 p :- p1, ... ,pn,fail. p. これは美しくない。 >>309 haskellより、やることが制限されて簡潔で lispのようにS式まみれにならず、 容易にバックトラックやエキスパートシステムを実現できる 優れた言語じゃないか 演習でしか使ったことないけど 美しくない言語は幾らでも挙げられるけど、美しい言語となると難しいな prologはプログラミングしてるってより、データベース作ってる気分になる。。。 haskellベースに論理型言語を足したcurry もしくは、prologベースに関数型言語を足したmars辺りは美しいんかね? 関数スコープなのって、実装が簡単だからでしょ。 関数スコープで十分だとかって言うのは、酸っぱいブドウ。 ブロックスコープに越したことはない。 手続き型はobjective-cが綺麗 cはオブジェクト指向が使えん。汎用的なコレクションライブラリがない c++は山ほどのドキュメントを読まないと怖くてSTLすら使えない。cとの中途半端な互換性 javaは命名規則が長い。オペレータをオーバーロードできない。プロパティがない。GUIが発展しない c#はネストが深い。ヘッダが読めん。ポインタ使い辛い >>315 GObjectつかえばCでも現代的なOOはできるぞ。 >>299 ブロックスコープ使うならwithが綺麗。 with({ a: 1, b: 0}) { b = a++; //withで宣言したラベルを使う } //ここでaとb消滅 >>315 C++べつに使えるよ 自分が覚えにくい&挙動が不審な部分は絶対に触らないようにしていけばいいだけ 複数人で組む場合は知らない。そもそもそれはC++に想定された使い方ではないと思う あとobjective-cはゴミ あんなゴミは見たことない そういや神オブジェクトって奴いたなぁと思ってみにきたが 死んだのか? 大言はいてたわりにはあっさりと消えたな 見た目が綺麗なのはPythonかLispだろうな ただ俺はRubyのソースコードのほうが自分の中で思考がまとめやすいってだけかな キチガイに刃物ってこういうことだと思う rubyはuyに持たせてはいけない刃物だったんじゃないかと最近思う 俺がかくrubyコードとネットにあがるrubyコードって質がまず違うよね、何故俺にはここまでrubyが使えるのだろう Matzには本当に感謝をしている、rubyがなければ自分が何年間もかけて言語を作らなければならなくなった 俺が何年間もかけて言語を作っていたはずの、その時間で俺は別のことをやれる とてもこれは感謝以外に何ものでもないよ ttp://twitter.com/akiradeveloper 奴ならここに >>322 礼をいうべきか否か リンクたどっていったら冗談きついくらいのヒゲ画像と本名が出てきて さらにググったら京都大学スレでも晒されてるし涙でてきた とりあえず、なんか技術者としては平凡以下に収まってしまったようだな Rubyプログラミング関数型プログラミングって3年前も同じことを言ってるの見たわ この3年間何やってた。。 少しは期待していたのに化ける事がなかった残念 やっぱりJAVAなんて使っているから・・・ >>321 誰へのレスかと思ったら俺へのレスか 俺が1日中2chしかやっていないと思っているのだろうか? 書き込み数はコテハンだから多く見えるだけ 神オブジェクトはでもRubyに興味持ち始めたんだったら、 まだ救う価値はある どうせあの手のタイプはPython側に行くのはなんとなくわかるけどね 小手先の技術が必要になるようなCやperl等での 手続き型プログラミングのロジックや小さく圧縮されたショートコーディングのようなものは絶対かけないから rubyはきっと向いていないだろう 自分でrubyはかけても他人のrubyコードが読めないとか前言ってたのは、おそらくそれのせい。 俺にとってはどんなrubyコードでも読みやすいけど 奴はPythonに収まるだろうな 学校でSchemeを勉強して以来Schemeが好きになった。 括弧の多さなんて気にならない。 見た目はそんなに美しいってわけでもないけど、 非常に書きよい、心地よい。 汚いのは英数字と記号だからね 文字のすべてが ・ ― | ■ あたりで構成されていれば綺麗だよ ランク付けは要らないが、各言語の「考え方」と「記法」を区別してスマートさの得失整理するのは有意義。 パールパイソンルビーには特色があって 開発者のやりたかったことも伝わってくるけど PHPやJSにはそれがないんだ 主張のようなものを何も感じない ただのなんのへんてつもない言語A、言語Bって感じ あとC#にも主張がなにもないな C++にはかなりある javaには少しある 俺様にとってプログラミングは道具ではなく一般的じゃない変な方法を探し出しその上で効率よく目的を達成するゲームだから 言語に癖がないとさ プレイする価値のないクソゲなんだよ Prologは極めて美しくもなるし、醜悪に書くこともできる。 自在性のプログラム言語。 >>333 まぁ、分類としては概ね同意するよ。 perl/php/JS あたりは、そもそもが綺麗なプログラミング言語を作ろう、というのが主目的で作られたものじゃないから。JS はそれでもよくできているが。 c#は、javaとc++の失敗から学んで生まれた実践から出来た言語だよ。 jsとrubyも同じようなもの perlとPHPがユーザーのニーズから後付で膨れて失敗したか、失敗しそうな言語 c++は、どっちかっていうとアカデミックな立ち位置から生まれ、 速度といった十字架を背負った唯一無二のソフトウェアを書くための言語 >>333 このスレで美しさの欠片もない言語をいくら並べてみても仕方ないだろう 美しいというのは基準が酷く漠然としているが 長いプログラマー経験から思う、一般的に美しい プログラムと言われやすい書き方の特徴を挙げてみよう。 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で装飾されていることで格調が高くなる。 はっきり言えば、上記は古い環境の制限から仕方なくおこなわれてきた物が多く 現代の環境では全く推奨されるべき物では無い。しかし、経験の積んだエンジニアは 古い慣習を引きずっていることが多いし、それをお手本として学ぶ事になる場合が多い まぁ、80桁超えないように書くのは今のモニタだとむしろ読みにくいかもしれんね。 オブジェクト指向言語は一体にゴツくて美しいとはいえない。 しかし、主流ではあるし、このクラスは独自に美しさを競うべきではないか。 lispは勝ち抜けとして考えると次点はpython 閉じ括弧はソースリーディング時にはいらないんだよ でもコーディング時には必要 Haskellは数式だし、Prologは論理式。 姿は美しいが、実は、先にモデルがあって、記号を入れ替えただけ。 独創性は感じられない。 Scheme Prolog SmallTalk それに手続き型から Python でいいんじゃないか 美しいという定義が何なのかによる。 可読性なのか、コード量が少なさなのか、それは人それぞれだ。 C#は読みやすくて好きだけど、 WPFで使うラムダ演算子とか見ると、読みにくくてきたねーと思う。 PHPは標準関数の名前がグダグタで汚いと思うけど シンプルに書けるところは綺麗だと思う。 C言語は好きなんだけど、標準じゃ文字列とか解放とか面倒で、色々ライブラリ入れるんだけど、 入れたライブラリを作った人のセンスがマチマチで、何というか関数名の統一の無さが気に入らない。 学術的な部分で強い言語と実用的な言語も分けた方がいいね >>347 Prologは今日では学術的の方に分類されるだろうがカットは実用的な要請によって 使われて見苦しくなっている >>348 Prologで美しくない部分って ! だけだろ。 assert,retractでグローバル変数定義なんて糞だと思った 1年ぐらい演習と講義でオタクな準教授から教わったけれども、 現実世界のどこで使われてるのかがわからないし、使いこなすには1年の講義なんて時間は短すぎた。 はっきりいっておく。古典AIなら動的言語で実装した方がマシである。 そんなの調べりゃ5分でわかること AIに関わらずそれ何も出来ないよ assert,retractはグローバル変数ではなく、述語定義(デーベース定義)だし、 Prologは動的言語だ。それにPrologは4時間で使えるようになるよ。 >>353 (データベース定義)ねw 理解するには4時間で十分だが、典型的なプログラムのパターンを知らないと、 書けないね。 >>350 一度全部リストの読み上げて、というようなことを許せる人にとっては、 十分に美しいよ。プログラムパターンもプログラム言語の中で最少だろうし。 >>356 リストに読み上げてとは、findallで節から引数のリストに変更することかな? それともファイルからの入力を全て一度リストに取り込むこと? >>353 4時間で扱えるって、せいぜいサザエさん課題ぐらいの問題じゃないか ビッグマウスもほどほどにしろよ。それともΣプロジェクトに加わった人? 大手って、これで自然言語処理だったり仕様記述してたりするのかしら >>359 そんなこといってもPrologの講習会はほとんどが2+2の4時間だよ 教えることとしてはそれで十分 あとは受講者が工夫する Prologは オブジェクト、クラスはもちろん 型、ブロック、スコープ、マクロ、クロージャ、遅延評価、 グローバル変数、ローカル変数、議論の対象となる概念のほとんどと無縁 極論すれば、IF文もループもない 教えることなんてほとんどない append/3が理解できたらおわり 関数型厨がλあればなんでもできるとかほざいてるのと一緒で 本当に意味がないんだよそれw ようはどんな方法でもいいから0と1が表現できたらすべて表現可能 つまりですね 「変数宣言する。変数宣言しない」 01表現できてるよな これですべてのプログラム組めるよ こんなことはとっくにわかってんだから 今更珍しがる事とかなんにもないんだよwwwwwwwwwwwwwww >>362 少なくとも先輩達が難しいこと言って勉強しなくてはならないということは起こらない Prologは単一化とバックトラックを再帰の枠の中で理解することが必要。 囲碁のルールよりは少し複雑というレベルの一人ゲームのようなもの。 初心者向きの課題を考えて少しずつ「強く」なっていく以外にない。 他言語の重要な構成要素のものでPrologにはないというものがあり、 例えば配列だが、これを用いているアルゴリズムはリストに置き換える 必要がある。そういう時のための情報は外部サイトにほとんどないから これも自分で考える。 一般に最初から難しい課題が与えられる傾向にあり、これがPrologの 難しさの原因。初心者に初段の課題をやらせても実力向上にはならない。 >>365 囲碁にはどちらが勝つかつまりどうなったら勝負がつくかの難問がありPrologよりずっと難しい。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる