1 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 22:40:17 ] The Scala Programming Language ttp://www.scala-lang.org/ チュートリアル日本語訳 ttp://homepage.mac.com/takashi_miyamoto/scala/ScalaTutorial.pdf どう書く?org Scala ttp://ja.doukaku.org/lang/scala/
2 名前:デフォルトの名無しさん [2008/03/10(月) 23:06:25 ] 不感症になったのか、こーいうのみてもなんも感じなくなってしまった
3 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:08:04 ] 日本語の入門書がでたら買う。
4 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:28:11 ] Java のライブラリがそのまま使えるってのは ライブラリ実装の手間を省けるいいやり方だな。
5 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 11:47:44 ] Javaのgenericsはそのまま使えないと聞いた気が
6 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 23:12:02 ] >>5 www.scala-lang.org/downloads/changes.html Version 2.7.0-final (released on 06-Mar-2008) # [changed] - Generic Java types are now supported by default (was -Ygenerics). # [changed] - Target jvm-1.5 is now the default.
7 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 00:19:52 ] >>5-6 試してみた $ scala -version Scala code runner version 2.7.0-final -- (c) 2002-2008 LAMP/EPFL $ cat generics.scala import java.util._ var list = new ArrayList[String] list add "one" list add "two" list add "three" println( list size ) println( list ) $ scala generics.scala 3 [one, two, three]
8 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 00:33:29 ] チュートリアル日本語訳 ttp://homepage.mac.com/takashi_miyamoto/scala/ScalaTutorial.pdf ↑を読んでたんだけど「ケースクラス」っていうのがよくわかんなかった。 多態性みたいなのが簡単に記述できますよってことなのかな よくわかんないまま読み進めてたらいきなり微分の話が出てきて頭が爆発した。
9 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 01:27:25 ] >>8 MLとかHaskellにあるやつで、 要は強力なcase文、なはず でもcase文だから下手に使うと拡張性を失うわけだよね
10 名前:デフォルトの名無しさん [2008/03/12(水) 08:26:14 ] ものすごい説明でびっくりした。「MLとかHaskellにあるやつで」までしかあってないよ!
11 名前:9 mailto:sage [2008/03/12(水) 12:24:00 ] >>10 む、そんなに間違ってる? 拡張性と言ったのは、既存のコードを修正せずに型を追加できるかという話で、 型の定義の追加に関してはたいていの関数型言語では構文上無理な気がするが、 Scalaはcase classを別の場所であとから追加すれば可能な気がする。 一方、パターンマッチのコードは一カ所にまとめないといけないから、 拡張しようとしたら修正が必要では?
12 名前:デフォルトの名無しさん [2008/03/12(水) 22:00:57 ] んー、言いたいポイントがよく理解できないんだけど、 まずmatch構文の中で特殊に使える「クラス定義」であって、case「文」じゃないでしょっていうのと、 MLやHaskellを引き合いに出して1行で説明しようとするなら「元々は代数データ型を模すためのもの」とでもいうのが適切では?と思った。 拡張性云々はOCamlのポリモーフィックヴァリアントと比較すると面白いかもしれないけど、 8に対するレスとしては飛びすぎではないかな。
13 名前:9 mailto:sage [2008/03/13(木) 00:02:03 ] >>12 >>8 が多態性と書いていたので拡張性に関する話をふってみた。 代数データ型をといわれてもピンとこないんだが... MLやHaskellを引き合いに出さない方がよかったか。
14 名前:8 mailto:sage [2008/03/13(木) 01:08:58 ] まだよくわかってないけど 「関数型言語ではよくあること」ってことね JVMで動く言語って聞いたのでJavaの知識が役に立つかと思って触れてみたのだけど Javaしか知らない俺には難しい よく考えてみたら多態性は継承で実現できるのだから ケースクラスってのは、多態性とは違う何か得体のしれない概念なのだろうなあ pdfをもうちょっとよく読んでみるよ
15 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 01:44:40 ] ちょっとメモ ttp://www.ibm.com/developerworks/jp/java/library/j-scala01228.html
16 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 01:50:55 ] >>14 case classもクラスの一種なので多態性を実現するのにも使える ただ、case classで定義したクラスは ・クラス名(引数列)でインスタンスを生成できる ・パターンマッチングに使える という特徴がある。具体例を示した方が早いと思うので示すと abstract class Exp case class Add(lhs :Exp, rhs :Exp) extends Exp case class Sub(lhs :Exp, rhs :Exp) extends Exp case class Num(value :Int) extends Exp という定義があったとして、(5 - 3) + 1という式の構文木は次の ように表記できる。 val exp :Exp = Add(Sub(Num(5), Num(3)), Num(1)) この式を計算する評価器はパターンマッチングを使って 次のように書くことができる(MLとかHaskell知っている人には お馴染みだけど)。 def eval(exp :Exp) :Int = exp match { case Add(l, r) => eval(l) + eval(r) case Sub(l, r) => eval(l) + eval(r) case Num(n) => n } ここでポイントは、インスタンスのクラスによる分岐と、インスタンスから フィールドを取り出す操作が同時に行えていること。
17 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 07:17:08 ] >>16 なんとなく分かってきた 昔聞いたことのあるインタープリターパターンに似てる メンバ変数を定義して、コンストラクタで代入っていうのを書かなくても クラス名(引数列) って書いたら引数列の部分がが勝手にメンバ変数になってくれるのか Javaで構文木みたいなの作ろうとしたら anond.hatelabo.jp/20080314064942 ↑こんな感じになったよ (長い!)
18 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 07:24:35 ] eval()を外に出すと public int eval(Exp exp){ if(exp instanceof Add){ return exp.getHidari() + exp.getMigi(); }else if(exp instanceof Sub){ return exp.getHidari() + exp.getMigi(); }else if(exp instanceof Num){ return exp.getSelf(); } } こんな感じにしないといけなくて こんなif文をズラズラと書くよりだったら それぞれのクラスの中でeval()するべきだろうって思っちゃうので 理解するのが難しかったんだ
19 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 07:28:02 ] あ、間違えた public int eval(Exp exp){ if(exp instanceof Add){ return eval(exp.getHidari()) + eval(exp.getMigi()); }else if(exp instanceof Sub){ return eval(exp.getHidari()) + eval(exp.getMigi()); }else if(exp instanceof Num){ return exp.getSelf(); } } こうか
20 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 09:46:06 ] >>18 >>19 ごめん。Subを計算するときにも足しちゃってた。 正しいのはこう。 def eval(exp :Exp) :Int = exp match { case Add(l, r) => eval(l) + eval(r) case Sub(l, r) => eval(l) - eval(r) // Subなのにミスって足してた case Num(n) => n } あと、パターンマッチングは本質的にはif(a instanceof A) ... else if(a instanceof B) ...を 簡潔に書くための仕掛けでしかないけど ・フィールドからの値の取り出しを同時に行える ・パターンをネストできる(後述) ・パターンが網羅されているかを静的にチェック可能(後述) のがポイント。パターンがネストできるというのは、例えば exp match { case Sub(Add(e1, e2), Add(e3, e4)) => println("(e1 + e2) - (e3 + e4)") case _ => println("failure") } のようにすることで、複雑な構造に対してマッチングを行うことができること を示している
21 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 09:46:41 ] 続き。 パターンが網羅されているかを静的にチェック可能というのは、 例えば次のようなコードを書いたときに(Numのパターンの書き忘れ)、コンパイラが warningを出してくれることを指している。 def eval(exp :Exp) :Int = exp match { case Add(l, r) => eval(l) + eval(r) case Sub(l, r) => eval(l) + eval(r) } ただし、Scalaでこの場合にwarningを出すためには、宣言を abstract sealed class Exp case class Add(lhs :Exp, rhs :Exp) extends Exp case class Sub(lhs :Exp, rhs :Exp) extends Exp case class Num(value :Int) extends Exp のように、抽象クラスであるExpをsealedとして宣言しておく必要がある。
22 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 00:54:41 ] とりあえず A Scala Tutorial for Java programers を読んだのですが 次は何を読めばいいですか? どうもプログラミング言語の学習の仕方がいまだによくわからなくて困ってます。
23 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 01:34:52 ] >>22 とりあえず、何かネタを決めて適当なプログラムを書いてみるのが 良いと思う。Scalaやってるってことは他の言語は既に知ってるってこと だろうから、とにかく書いて慣れるのが一番。あと、ScalaReference.pdfは 読むのにやや知識が必要だけど、Scalaにどんな機能があるのかを知るのに 有用だから、暇なときに眺めてみるのも良いかも
24 名前:デフォルトの名無しさん [2008/03/15(土) 01:46:48 ] 日本語の入門書がまだないのはしょうがないとして。。。 洋書だったらなんかある?
25 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 01:53:40 ] >>20-21 丁寧にありがとう! sealed(シールド) class なんてのがあるんだ また守備力があがってしまうな
26 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 01:55:08 ] Java 系だから final でいいと思うのに C# 風の名前付けしてるんだな。
27 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 02:06:23 ] >>26 いや、実はfinal classもあるんだけど、sealedとは意味が違うという罠 final classはJavaのそれと同じで、そのクラスから継承することができない という意味。sealed classは同じコンパイル単位でならそのクラスから継承する ことができる
28 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 02:08:49 ] >>24 洋書では、Programming in Scalaという本が(今年中?)出る予定。 現在は、PrePrint版を購入することができる。 www.artima.com/shop/forsale
29 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 02:09:40 ] >>27 なるほど。
30 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 02:11:46 ] >>27 なるほど
31 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 02:16:44 ] ttp://www.scala-lang.org/docu/files/ScalaReference.pdf を読んでたんだけど(読めないけど) 予約語の一覧に「public」が見当たらない しかも AccessModifier ::= (‘private’ | ‘protected’) [AccessQualifier] って書いてある。 もしかしてScalaには「public」修飾子がない? クラスもメンバもみんなデフォルトでpublic?
32 名前:デフォルトの名無しさん [2008/03/15(土) 02:22:19 ] >>28 サンクス 今年中か。。 英語の勉強でもしとくか・・・
33 名前:31 mailto:sage [2008/03/15(土) 02:27:08 ] 試してみればよいのか scala> var public = 1 public: Int = 1 scala> System.out.println( public ) 1 あぁ… 無いんだ
34 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 02:27:47 ] >>31 うん。Scalaではアクセス修飾子はデフォルトでpublicなので 用意されてない。
35 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 12:14:16 ] >>27 jarのマニフェストに書くSealedと同じようなものか。
36 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 15:53:01 ] >>8 case classは、 pattern matchのある C言語でいうところのunionです。 一つの型にマージしたいところに使います。 例えばポインタがどのケースも指す可能性がある場合。
37 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 21:42:49 ] Rubyとどっちが強いの?
38 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 21:49:33 ] Scalaです。普及度以外は。
39 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 22:04:37 ] Rails相当のものはありますか?
40 名前:デフォルトの名無しさん [2008/03/15(土) 22:08:04 ] Javaの標準ライブラリなら何でも使えるの?
41 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 01:44:44 ] traitとabstract classの違いって何ですか? なんか、同じのような……。 >>40 多分そうです。
42 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 02:13:39 ] >>41 abstract class は抽象クラスで trailtはmixin 継承元としての抽象クラスはひとつしか指定できないけど、mixinはなんぼでも指定できる。 abstract class 通信機 trait テレビ trait おサイフ class 携帯電話 extends 通信機 with テレビ with おサイフ { … }
43 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 02:22:25 ] class A extends B とした場合、 継承だと B に A の実装を追加したものが A になるし、 mixin だと A に B の実装を追加したものが A になる。 継承と mixin の大きな違いはここにある。 >>1 のチュートリアルにある例で言えば、 Ord の実装の中に def <=(that: Any): boolean = (this < that) || (this == that) ってのがあるけど、Ord の中には == の実装どころか宣言すらない。 mixin 先に == があれば使えるし、無ければ使えない。 == が既にあるクラスに mixin されることを前提に作られている。
44 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 02:28:46 ] つまり、mixin の場合は A にある実装を B で使うことができる。 継承では派生クラスの情報を基底クラスで使うことになるから、 こういうことは基本的にはできない(CRPT は例外だが)。
45 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 14:55:02 ] CRPTって何?
46 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 18:48:17 ] en.wikipedia.org/wiki/Curiously_Recurring_Template_Pattern 要するに親クラスが派生クラスの実装に依存できる。 boostのiterater_facadeで非常にうまく使われてる。
47 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 08:24:53 ] mixinがあれば継承はなくてもいいのかな overrideができないのかも知れないが
48 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 10:15:18 ] Scala的に望ましい言語仕様と、JVMのセマンティクスとの軋轢ってないの? YASVマダーチンチン。
49 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 10:17:58 ] >>22 次に読むべきはたぶん、このへん。 www.pana-wave.com/news_lr.html
50 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 11:11:29 ] 「スカラー値」とかの普通名詞じゃなくてなんかの固有名詞で 響きが脳みそのどっかにひっかかってたんだけど これだったか・・・
51 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 22:44:57 ] The Scala Language Specificationとかにさっと手が伸びるような人は 画面で読んでるのでしょうか? 印刷して読んでるのでしょうか?
52 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 23:06:46 ] 印刷一読、画面参照
53 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 23:08:23 ] 初ほしゅ・・・って、まだ不要なのか?
54 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 20:14:39 ] なぜ素直にJRubyをつかわないのか
55 名前:デフォルトの名無しさん [2008/03/22(土) 21:30:09 ] JRubyってアプレット作れるの?
56 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 21:33:55 ] 作れるけどなに?
57 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 21:44:01 ] Rubyは危険な宗教だから近づきたくない
58 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 21:46:35 ] モルモン教か
59 名前:デフォルトの名無しさん [2008/03/22(土) 21:48:17 ] >>54 やっぱスピードじゃない?
60 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 02:41:29 ] >>54 型チェックに魅力を感じるからじゃない
61 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 03:57:02 ] 代入式がUnitを返すのですが、こういう仕様なのですか?
62 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 05:15:27 ] うん
63 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 05:26:08 ] Scalaは面白いしそこそこ使えそうではあるんだけど 構文を導入せずに見た目の帳尻だけ合わせてる部分が 長い目でみればマイナスに表れるという感がぬぐえない。 丁度C++のような立ち位置だと思うこともあって、将来的な筋の悪さを感じる。 (C/オブジェクト指向/C++ と Java/関数型/Scala という対比。)
64 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 08:29:46 ] >>63 C++のような立ち位置といのは言い得て妙だな
65 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 08:31:24 ] 途中で送信してしまった。 ただ、構文を導入せずに見た目の帳尻だけ合わせてるってのは どの辺だろう?case class/pattern matchingの辺り?
66 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 14:54:43 ] >>63 おいおい、Scalaは設計センスはすごくいいぞ。 ありとあらゆる言語をよく研究した結果作られた言語。 問題は流行るかどうか。 うまく作りすぎてるんで、 perl/python/rubyなんかのなんちゃって言語よりは、 最初のハードルが高いし。
67 名前:デフォルトの名無しさん [2008/03/23(日) 14:56:39 ] ScalaってHaskellかOCaml 強いて言えばどっちに近いですか?
68 名前:デフォルトの名無しさん [2008/03/23(日) 16:09:26 ] OCamlじゃないかな。評価戦略とオブジェクト指向。
69 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 19:57:06 ] >>66 > ありとあらゆる言語をよく研究した結果作られた言語。 は > おいおい、Scalaは設計センスはすごくいいぞ。 の根拠にはならんだろう。
70 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 21:07:51 ] >>67 強いて言えばOCamlだけど OCamlは関数型言語にOOするための機能を入れた言語 ScalaはOO言語に関数型プログラミングをするための機能を入れた言語 って感じでScalaの方がよりOOよりな感じはするね
71 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 23:24:09 ] 型システムは、メジャーな言語ではC++0xが一番近いよ。 後はHaskellとかGとか。 JavaとかノーマルなOCamlはクラス指向が非常に強いから似てない。
72 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 23:29:17 ] C++0xってメジャーな言語なのか?
73 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 23:35:25 ] おお、Scalaのスレができてる Scala自体はいい言語だけど、Javaのライブラリがうんこだよな
74 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 23:57:28 ] ライブラリのどの変がダメ?
75 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 00:03:13 ] Scalaのライブラリはどうですか?
76 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 11:10:28 ] >>74 粒度が細かすぎて使いづらいというのはよく言われていることだけど、 それをScalaから使うというのがまたしんどい 結局Java使ってるのと大差ない気がしてくる
77 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 12:57:22 ] >>76 Scalaから使うときは簡単なラッパーをかましてやるのが良い使い方だと思う 本当のところ、早いところScala独自のライブラリが充実して欲しいんだけど 簡単なラッパー作るくらい大した手間じゃないし自作するのが手っ取り早い たとえば、IOならこんな感じ // 定義 def withReader[T](File path)(proc :BufferedReader => T) :T = { val reader = new BufferedReader(new FileReader(path)) try { proc(reader) } finally { reader.close } } // 使用 withReader(new File("hoge.txt")){reader => //readerを使ったコード } ちなみにscala.io.Sourceは色々と微妙で、使いづらい
78 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 22:58:01 ] それだと使う側のセンスが問われそうだな 俺だと劣化Rubyライブラリになってしまいそうだ 標準ライブラリで言語のポテンシャルを示してほしいところなのだが つーかこんなラッパーが全世界で何百と作られてんだろうなあ
79 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 23:01:55 ] というかラッパーが物凄く簡単に書けて、 再利用性も高いのが言語の売りの一つなので。
80 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 10:15:09 ] Lisp方言並に溢れかえるラッパーにwktk
81 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 12:08:18 ] >>48 に誰も反応してくれなくて寂しい俺が来ましたよ # あれは正確には、「JVM命令セット群のセマンティクス」と書くべきだった ライブラリの話も出てるし、言語として完成度上げるには、やっぱそろそろJava依存抜けようか。 って無理か。
82 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 16:48:04 ] どうしても隠せないのは実装に近いところ。 例えばboxing/unboxing関係のAnyVal/AnyRef。
83 名前:暗黙のthis mailto:sage [2008/03/25(火) 17:24:39 ] ScalaOverview.pdfの def + (x: Nat): Nat = if (x.isZero) this else succ + x.pred って、 def + (x: Nat): Nat = if (x.isZero) this else this.succ + x.pred のことなんだな。ちょっと混乱したので書いとく。
84 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 17:58:15 ] >>81 配列周りはScalaの処理系が凄いがんばって他のgenericなクラスと同じように 見せようとしてるなあと思った。JVMでは配列が特別扱いされてるから、 genericなクラスのように見せかけるのはなかなか大変 >>83 暗黙のthisはJavaでもほぼ同じだから、そんなに混乱しないと思ったけど、どうなんだろう。 Java以外の言語からScala入った人?
85 名前:暗黙のthis mailto:sage [2008/03/25(火) 18:04:02 ] operation invocationに()がないから混乱した。 Java以外にも関数型言語も分かるので、 curry化されてるのかな?と思ってしまった。
86 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 18:04:55 ] >>82 > boxing/unboxing関係のAnyVal/AnyRef。 なんとなく想像は付くんだが、具体的にはどんな例がある?
87 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 18:06:59 ] >>85 ああ、なるほど。invocationの()省略できる辺りは、なんか 構文的にRubyっぽい感じがするね。Scalaは細かいところで、 色々syntax sugarが多いから、慣れない内は混乱の元にも なるなと思った
88 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 18:11:19 ] あ、省略できるってのはちょっと不正確だったのでちょっと補足。 Scalaで0引数のメソッドを定義する方法は二つあって、 一つは class HelloWorld { def print :Unit = { println("Hello, World!") } } という形。この形の場合、 val hello = new Hello hello.print という形でのみ呼び出すことができ、hello.print()という呼び出し形式は コンパイルエラーになる。もう一つは、 class HelloWorld { def print() :Unit = { println("Hello, World!") } } という形。この形の場合、hello.print()と書いてもhello.printと書いても OK。
89 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 18:29:49 ] >>86 BoxedArrayはあれば便利だけど、なくても何とかなる。 どうしてもArrayの要素をポインタ共有したい時は、 セルクラスに入れてからArrray[セル]にすればいいから。 けどJavaではBoxedArrayがあるから、作っとかないと困る。 >>84 のいうようにうまく処理されているとは思う。 Nothingがあるからprimitive = null;問題も起きないし。
90 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 02:37:56 ] あんま愚痴っててもしょうがないので、 ありがちなところで、Ruby風文字列、正規表現ラッパーを作ってみた と言っても、まだ半分も実装できてないけど hexx.sakura.ne.jp/scala/RubyString.scala 使い方は、こんな感じ import ruby._ import ruby.RubyString._ println("hoge %d %s" % (1, "fuga")) // → hoge 1 fuga // Rubyでは // "hoge %d %s" % [1, "fuga"] "a\nbbb\nccccc\n".each(l => print(l.length)) // → 246 // Rubyでは // "a\nbbb\nccccc\n".each {|l| print(l.length)} println("abcde".sub("(a)b(c)d(e)") { m => val lm = RubyRegexp.lastMatch lm(1).upcase + lm(2).upcase + lm(3).upcase }) // → ACE // Rubyでは // "abcde".sub(/(a)b(c)d(e)/) { $1.upcase + $2.upcase + $3.upcase } 今のところ、Rubyに比べて嬉しいのは、EmacsのFlymakeがよく効くところだな 悪いところは、スクリプトで使うと、やっぱり起動が遅い
91 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 02:57:01 ] >>90 遅いよねぇ。 開発をスクリプトでやってデプロイはコンパイルしてって感じになるのかな。 でもあの起動の遅さはリズムが崩れる。
92 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:39:06 ] NetBeansでScalaが書けるって聞いたんだけど 試してみた人いる?
93 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:42:07 ] >>90 じゃあ開発者の楽しさとしてはやっぱりRubyのほうがいいんだね。実行するたびにモタつくなんてなぁ。
94 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:38:57 ] >>93 > 開発者の楽しさ 俺はコンパイラに指摘される型エラーをつぶしていくのが楽しい だからMLも好き
95 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 06:50:40 ] 同じJVMをつかっているのに、なぜJRubyよりも性能がいいのですか? Rubyをなんちゃって言語というほど高尚なのですか?Rubyより悪い点はどこですか?
96 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 07:01:52 ] >>95 性能がいいのは主に ・静的型付けであり、かつ比較的Javaに型システムが近いこと (メソッド呼び出し時にinvokevirtualなどVMのメソッド呼び出し命令をそのまま 利用できるし、数値演算もVMの命令を利用できる) が理由だろうな。他の理由もあるだろうけど、たぶんこれが一番大きい。
97 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 09:36:07 ] 楽しさって言われてもなあ、スクリプトの起動がそれほど気になるならそうかもしれないけど 対話環境で開発することも多いだろうし、Scalaはスクリプトの方がメインではないだろうし Rubyとの違いは、やっぱり型が静的か、動的かにつきるんじゃないの? 静的な型でもここまでできると思うか、 やっぱり面倒臭いから静的な型なんていらないと思うか あとは関数型から引き継いだパターンマッチ、ケースクラスとか ErlangからパクったActorがどれくらい役に立つか
98 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 09:39:38 ] JRubyより性能いいの? JRubyってJavaのバイトコードをターゲットにしたコンパイラなの? 独自バイトコードインタープリタなら遅くて当たり前だけど…
99 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 09:42:59 ] >>97 あと、mixin-compositionがあるのが重要。
100 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 10:03:23 ] ああ、そういえばScalaは後からmixinを足せるんだったな 確かに使い方によっては強力な感じはする