パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

JRubyプロジェクトリーダーがSunに入社」記事へのコメント

  • 今さら (スコア:2, 興味深い)

    by Anonymous Coward
    JVMで複数の言語か。何年もすべきだったことだけど、今となっては.NETに対する敗北としか思えない。
    何から何まで後手後手に回ってるSunを象徴してるように思う。
    • 対応言語が多いって, 特にエンタープライズ用途ではあまり有効に働かないんじゃないかな? 特に一定の品質を求めるとか, 実運用に入った後のメンテナンスなんてことを考えると, 最大公約数的な言語ひとつ(多くても2つ)でやっちゃった方が良いわけで.

      かってCOBOLが主流だったころには, デシジョンサポートや医薬統計処理の数値計算までCOBOLで組んでいたなんて話もあるぐらいですから. まあ, 単なる趣味の領域では使える言語が多いほうが面白いんですけど.

      • Re:今さら (スコア:3, 興味深い)

        by Anonymous Coward
        どちらかというと世代交代という言葉がチラつくような気がします。

        ●10年くらい前はC(C++)。
        ●今は(JVMはさておき言語としての)Java。

        それが「ちょうどその(この)時点で引導を渡されつつある言語」なのでしょう。

        Javaの生産性にはぼちぼち限界を感じつつあります。C/C++の延長な伝統的世界観の、型が下手に強い変数(そのくせHaskelよりチャチ)とか、狭い意味での関数/メソッドしか無い(そういやC#もJavaもClosure追加しようと悪あがきしてますねえ)とか、要するに古さが目立つんですよ。生産性の低さが目立つ。

        脱線になりますがJakartaのBeanUtilsが結構笑えます。あ
        • クロージャなんていうものがソフトウェアエンジニアリング上使い物になるのでしょうか。こういうときに便利だというのがあれば教えてもらいたいです。

          ところで私はJava派だったのですが、最近VB6.0とかASPとかで無節操にExcelとかのオブジェクトを使って作るプログラムに妙に感動しています。これが理想とは言いませんけどね…。
          • by Anonymous Coward
            anArray.sort(new Comparator(){
                int compare(T o1, T o2){
                    return o2 - o1;
                }
            });



            anArray.sort{|o1, o2|
                o2 - o1
            }

            になるだけでも、十分強力な(開発プロセスの)燃料だか潤滑剤だかだと思います。

            あ。これだけ短いので行を分ける必要すら感じなくなりますね。

            anArray.sort{|o1, o2| o2 - o1 }

            こんな風に5行を1行に詰めるだけでも「ちりつも」なんですよ、開発って奴は。その差は(劣ってるほうにとっては)ボディブローのようにじわじわと効いてくるんです。

            そして、偉い人(例えばプログ
            • > anArray.sort(new Comparator(){
              > int compare(T o1, T o2){
              > return o2 - o1;
              > }
              >});

              >が

              >anArray.sort{|o1, o2|
              > o2 - o1
              >}

              それは「クロージャの」メリットじゃない。だって、enclosing scopeの変数を参照してないから(匿名関数=クロージャ、ではない)。単にRubyのブロックが、Javaの匿名クラスよりタイプ数が少ないと言えばいいだけのこと。
              • いい質問ですねえ(^^;
                ええ。ご指摘そのものは、その通りです。

                で、じゃあ本当にクロージャの話をしようと思ったら、
                このタイプ量の違いが更に激烈に開くことになるんですよね。

                Javaに限った話をすると、匿名クラスの外の変数を匿名クラスの中から参照したいとき、final宣言された変数であることが要求されています。つまり変数というよりは定数です。

                それって、変数名と値のペアは覚えているものの、その両者のつながりを司っている何者か(すなわち環境)を覚えることは拒絶してるということになるわけで、つまりクロージャ(でブロックの中から値を持ち出すこと)が出来ない。

                ということは
              • 相変わらず、細かいツッコミが中心になりますがご容赦

                > Javaに限った話をすると、匿名クラスの外の変数を匿名クラスの中から参照したいとき、final宣言された変数であることが要求されています。つまり変数というよりは定数です。

                これを定数というのは、一般的な言葉の使い方としては正しくないですよね。関数型言語では、変数自体は通常immutableなわけですが、それを持って関数型言語の変数は定数だと言ったりはしないわけで。まあ、単なる用語の使い方の問題ですが。

                > final HashMap env = new HashMap();
                > anObject.hoge(new Fuga(){
                >  int doFuga(){
                >  env.put("xx", "yy")
              • ん?生成時に一度だけ値を設定できて、あとは変更できないってのは、「定数」そのものでは?地方によってそう呼ばないかどうかは別問題でしょう。

                >Genericsの機能を活用して、もうちょっとマシにできる

                いやー。なんか凝ったコードどもっす。static importを使ってrefを予約語まがいの使い方をしてる感じですね。私としてはちょっと腰が引けます。

                私なら、そういう慣用句を30回くらい書いた(書かされた)頃には、「そう書かざるを得ない」言語仕様に対して殺意を抱くでしょう(^^;。JavaについてはそれこそJava7でクロージャがつくかもだそうなので、うまいこと私の殺意を回避
              • by Anonymous Coward on 2006年09月19日 18時59分 (#1021970)
                #1021135です。

                > 私なら、そういう慣用句を30回くらい書いた(書かされた)頃には、「そう書かざるを得ない」言語仕様に対して殺意を抱くでしょう(^^;。

                自分もこの仕様に関しては、むかつきますが、そこまで強烈ではないですねえ。まあ、言語仕様に対するスタンスの違いなんでしょうけど。

                > JavaについてはそれこそJava7でクロージャがつくかもだそうなので、うまいこと私の殺意を回避したなぁと思ってるところです(はぁと

                最初のドラフトは良かったのですが、最近になって改訂されたやつを見てみたところ、改悪されてたので、自分はむかつきました(笑)。

                どの辺が改悪されてたかというと、初期のものでは、Function Typeという概念が導入されてて、int(int)で「intを受け取ってintを受け取る関数」を表現できたんですね。なのに、改訂されたやつを見るとFunction Typeなどが削除されてて、匿名関数っぽい(int n){ ... }のような式は、「メソッド1つだけ」のinterfaceが要求される文脈でのみ、使用可能というようになってしまったっぽいのです。まあ、それでも以前よりは便利なのですが、最初の案の方が良かっただけに、ちょっとがっくり来ました。

                > ん?生成時に一度だけ値を設定できて、あとは変更できないってのは、「定数」そのものでは?地方によってそう呼ばないかどうかは別問題でしょう。

                    static final int F = 0;

                みたいに、プログラムの他の部分に依存せずに値が決まって、かつ読み取り専用な場合には「定数」と呼ぶのがしっくり来ます。一方、他の部分に依存して値が決まる場合、例えば

                    int calc(int x) {
                        final int y = x * x;
                        return y * y;
                    }

                のようなメソッドの場合、y自体は一度値を設定したら変更されませんが、呼び出されるたびに、yはxの値に応じて違う値になるので、yを定数と言うのは抵抗があります。まあ、先ほどのコメントでも書いた通り、単なる用語の使い方の問題なのですが、 #1021149さんのような「定数」という用語の使い方はあまり聞かないので、違和感を感じたという話です。

                > もともとアンチ変数志向(とでもいうか)な関数型言語を、ここで引き合いに出すのは不味いのでは?Javaは変数がmutateする(というのかな?)のがアタリマエと捉えてる世界の住人です。世界が違うんだから一緒にはならないと感じてます。

                世界が違う(プログラミングパラダイムが違う)のは確かですが、ここで話題にしているクロージャの仕様に関しては同等ですし、比較に意味が無いということは無いでしょう。ましてや、OCamlやMLのようなpureでない関数型言語では、I/Oなどはimperativeに書くことが普通(なはず)なので、Rubyのopenのようなブロックを抜けたら自動でクローズされるような関数を書いた場合、Javaと同様の制約を背負うことになりますから、比較する意義は十分にあると思います。

                >「Listを再帰でぶん回す」(それを回すってゆーな!という声が聞こえそうだが)スタイルが定着してるせいだとか、多値をreturnできるとか、

                んー。少なくとも、Rubyのopen相当の使い方をする場合、それは無関係ですよね。

                > Polymorphを使わないか、あるいは使ってもJavaみたいな気の効かない型ルールで縛られてナイとか、
                そういうことだったりしますか?

                気の利かない型ルールって言うと、どの辺でしょう?nominal subtyping(明示的な宣言によってのみサブタイプ関係が決まる)のことでしょうか?

                > Javaの場合は、Polymorphできるメソッドの型(の特に返し値の部分)の縛りがキツイというか純朴すぎるので、ああいう喜悲劇げ起きてるという感じがします。(それどころかthrowsでまで縛るので更に不自由。)

                ここのPolymorphってどういう意味で使われてますか?いわゆる多相型のことだったら、Java 5のGenericsでそれはだいぶ緩和されてると思いますが。
                親コメント

開いた括弧は必ず閉じる -- あるプログラマー

処理中...