アカウント名:
パスワード:
対応言語が多いって, 特にエンタープライズ用途ではあまり有効に働かないんじゃないかな? 特に一定の品質を求めるとか, 実運用に入った後のメンテナンスなんてことを考えると, 最大公約数的な言語ひとつ(多くても2つ)でやっちゃった方が良いわけで.
かってCOBOLが主流だったころには, デシジョンサポートや医薬統計処理の数値計算までCOBOLで組んでいたなんて話もあるぐらいですから. まあ, 単なる趣味の領域では使える言語が多いほうが面白いんですけど.
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
未知のハックに一心不乱に取り組んだ結果、私は自然の法則を変えてしまった -- あるハッカー
今さら (スコア:2, 興味深い)
何から何まで後手後手に回ってるSunを象徴してるように思う。
Re:今さら (スコア:3, 興味深い)
対応言語が多いって, 特にエンタープライズ用途ではあまり有効に働かないんじゃないかな? 特に一定の品質を求めるとか, 実運用に入った後のメンテナンスなんてことを考えると, 最大公約数的な言語ひとつ(多くても2つ)でやっちゃった方が良いわけで.
かってCOBOLが主流だったころには, デシジョンサポートや医薬統計処理の数値計算までCOBOLで組んでいたなんて話もあるぐらいですから. まあ, 単なる趣味の領域では使える言語が多いほうが面白いんですけど.
Re:今さら (スコア:3, 興味深い)
●10年くらい前はC(C++)。
●今は(JVMはさておき言語としての)Java。
それが「ちょうどその(この)時点で引導を渡されつつある言語」なのでしょう。
Javaの生産性にはぼちぼち限界を感じつつあります。C/C++の延長な伝統的世界観の、型が下手に強い変数(そのくせHaskelよりチャチ)とか、狭い意味での関数/メソッドしか無い(そういやC#もJavaもClosure追加しようと悪あがきしてますねえ)とか、要するに古さが目立つんですよ。生産性の低さが目立つ。
脱線になりますがJakartaのBeanUtilsが結構笑えます。あ
動的言語って使えるの? (スコア:1)
ところで私はJava派だったのですが、最近VB6.0とかASPとかで無節操にExcelとかのオブジェクトを使って作るプログラムに妙に感動しています。これが理想とは言いませんけどね…。
Re:動的言語って使えるの? (スコア:1, 参考になる)
int compare(T o1, T o2){
return o2 - o1;
}
});
が
anArray.sort{|o1, o2|
o2 - o1
}
になるだけでも、十分強力な(開発プロセスの)燃料だか潤滑剤だかだと思います。
あ。これだけ短いので行を分ける必要すら感じなくなりますね。
anArray.sort{|o1, o2| o2 - o1 }
こんな風に5行を1行に詰めるだけでも「ちりつも」なんですよ、開発って奴は。その差は(劣ってるほうにとっては)ボディブローのようにじわじわと効いてくるんです。
そして、偉い人(例えばプログ
Re:動的言語って使えるの? (スコア:0)
> int compare(T o1, T o2){
> return o2 - o1;
> }
>});
>が
>anArray.sort{|o1, o2|
> o2 - o1
>}
それは「クロージャの」メリットじゃない。だって、enclosing scopeの変数を参照してないから(匿名関数=クロージャ、ではない)。単にRubyのブロックが、Javaの匿名クラスよりタイプ数が少ないと言えばいいだけのこと。
Re:動的言語って使えるの? (スコア:0)
ええ。ご指摘そのものは、その通りです。
で、じゃあ本当にクロージャの話をしようと思ったら、
このタイプ量の違いが更に激烈に開くことになるんですよね。
Javaに限った話をすると、匿名クラスの外の変数を匿名クラスの中から参照したいとき、final宣言された変数であることが要求されています。つまり変数というよりは定数です。
それって、変数名と値のペアは覚えているものの、その両者のつながりを司っている何者か(すなわち環境)を覚えることは拒絶してるということになるわけで、つまりクロージャ(でブロックの中から値を持ち出すこと)が出来ない。
ということは
●外から中に値を持ち込むことはそのまま出来るが、
●中から外に値を持ち出したければ、返し値や、final定数で「オブジェクトを保持するオブジェクト」を渡すか、といった工夫をしないとならない。
そして、interface互換だけど、値を持ち出したいパターンが色々有るかも知れないって場合は、
●返し値の型が1種類に限られる(Javaなら)ので、(すんなりとは)使えない。
●「オブジェクトを保持するオブジェクト」を作れば出来るわけだが、それって面倒。
●ってゆーかそういう面倒を肩代わりしてくれるのが「環境」であり「クロージャ」なのだからして…(^^;
final HashMap env = new HashMap();
anObject.hoge(new Fuga(){
int doFuga(){
env.put("xx", "yy")
}
});
foo = env.get("xx")
なんて書くくらいなら
xx = null
anObject.hoge(new Fuga(){
int doFuga(){
xx="yy"
}
});
foo = xx
#↑Java似の似非コード。ただしクロージャ機能つき。
って書けるほうがいいでしょう。
少なくともxxが変数であるって事実をIDEに捕捉して貰えるだけでも大きいし、むろんタイプ量もずっと少ないので、それだけミス(バグ)りにくい。
ーーー
ところで「値を持ち出すこと」自体のエンジニアリング上の意義は、まさか否定しないですよね?
確かにsortのComparator(に相当するブロック)から値を持ち出すことはあまり無いと思いたい。
てゆーか恐らくループ系の場合は、値の持ち出しは、多分あまり出番が無い。まあそうりゃそうですよね。そのブロックは何度も呼ばれるんだからループカウンタ(に強く依存する値)以外は持ち出す意味すら無いわけだし、ループカウンタだって(きちんとした内部イテレータのおかげで)持ち出す意義が殆ど無いし。
しかしリソース管理系の場合は違います。リソースの管理はあくまで処理の本題ではなく(AOP用語を借りるならば)「横断的関心事」なのだから、それを横切って(縦切って?)普通の変数の出入りを自由にやりたいはずです。こんな風に。
xxx = yyy
db.transaction{
hoge.update
if fuga then xxx = zzz end
}
puts xxx
上のコード、トランザクションを考えない時点ではこうだったはずです↓。
xxx = yyy
hoge.update
if fuga then xxx = zzz end
puts xxx
そこに単に「リソース管理したいから、管理しないとならん範囲を、カッコでくくってね」と(前述のマネージャがビギナー開発者に)要求するわけです。
そういえばJava AOP勢って、AOPの単位はあくまでメソッド単位でしたよね。上記のようにコードの途中に横断的関心事(?)を挟むなんてことは出来んわけで。
Re:動的言語って使えるの? (スコア:0)
> Javaに限った話をすると、匿名クラスの外の変数を匿名クラスの中から参照したいとき、final宣言された変数であることが要求されています。つまり変数というよりは定数です。
これを定数というのは、一般的な言葉の使い方としては正しくないですよね。関数型言語では、変数自体は通常immutableなわけですが、それを持って関数型言語の変数は定数だと言ったりはしないわけで。まあ、単なる用語の使い方の問題ですが。
> final HashMap env = new HashMap();
> anObject.hoge(new Fuga(){
> int doFuga(){
> env.put("xx", "yy")
Re:動的言語って使えるの? (スコア:0)
>Genericsの機能を活用して、もうちょっとマシにできる
いやー。なんか凝ったコードどもっす。static importを使ってrefを予約語まがいの使い方をしてる感じですね。私としてはちょっと腰が引けます。
私なら、そういう慣用句を30回くらい書いた(書かされた)頃には、「そう書かざるを得ない」言語仕様に対して殺意を抱くでしょう(^^;。JavaについてはそれこそJava7でクロージャがつくかもだそうなので、うまいこと私の殺意を回避
Re:動的言語って使えるの? (スコア:0)
> 私なら、そういう慣用句を30回くらい書いた(書かされた)頃には、「そう書かざるを得ない」言語仕様に対して殺意を抱くでしょう(^^;。
自分もこの仕様に関しては、むかつきますが、そこまで強烈ではないですねえ。まあ、言語仕様に対するスタンスの違いなんでしょうけど。
> JavaについてはそれこそJava7でクロージャがつくかもだそうなので、うまいこと私の殺意を回避したなぁと思ってるところです(はぁと
最初のドラフトは良かったのですが、最近になって改訂されたやつを見てみたところ、改悪されてたので、自分はむかつきました(笑)。