トップページ⇒tech
1001コメント329KB

プログラミング言語 Scala 7冊目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2011/09/04(日) 20:07:34.70
The Scala Programming Language
ttp://www.scala-lang.org/

■リンク集
ttp://sites.google.com/site/scalatohoku/%E5%8B%89%E5%BC%B7%E4%BC%9A%E8%B3%87%E6%96%99

■前スレ
プログラミング言語 Scala 6冊目
ttp://hibari.2ch.net/test/read.cgi/tech/1307416864/

■Scalaの紹介文(さわり)
Scalaは簡潔かつ優雅で型安全な方法でよくあるプログラミングパターンを表現できるように
設計された汎用プログラミング言語です。
Scalaはオブジェクト指向と関数型言語の特徴をスムーズに統合しておりJavaやその他の言語を扱う
プログラマをより生産的にすることができます。(以下略)
ttp://www.scala-lang.org/node/25

■Scalaに関する書籍(英語)
ttp://www.scala-lang.org/node/959
リファレンスマニュアルや草稿のPDFなども充実しているのでそちらも参照してください。
日本語の資料には、チュートリアルの訳やIBM dW、IT Proの連載記事、各々で開かれた勉強会の資料などがあります。
0002デフォルトの名無しさん2011/09/04(日) 21:10:02.11
>>1
乙なんだぜ!
「ERROR:Lvが足りなくてスレッド立て(ら)れません。」
とか言われてスレ立てられなかったんだぜ…。日に日に使いにくくなる2ch。
しかしこれ、"ERROR"が全角で"Lv"が半角という統一感の無さで憤死しそうになるな…。

あと次スレからリンクにはこれも追加しようぜ

プログラミング言語Scala 日本語情報サイト
http://sites.google.com/site/scalajp/
0003デフォルトの名無しさん2011/09/04(日) 21:25:15.30
前スレの終わり方なんなの…
0004デフォルトの名無しさん2011/09/04(日) 21:32:59.14
前スレのことは次スレに持ち込まないのが2chのルール
0005デフォルトの名無しさん2011/09/04(日) 22:14:45.74
はい
0006デフォルトの名無しさん2011/09/04(日) 22:33:14.54
そんなルールは初耳だなぁ
0007デフォルトの名無しさん2011/09/04(日) 22:36:41.32
上手く使えば、いい感じで話題が切り替えられるのが
1000スレッド落ちシステムの特徴だとは思う
0008デフォルトの名無しさん2011/09/05(月) 00:46:15.08
結局またモヒカンが来て
この定義はおかしいって騒ぐだけだろ?
0009デフォルトの名無しさん2011/09/05(月) 01:31:26.76
>>2
前方互換性の考慮の結果だよ
0010デフォルトの名無しさん2011/09/05(月) 21:30:15.12
なぜScala村にはモヒカン族が沢山居るのですか?
0011デフォルトの名無しさん2011/09/05(月) 21:35:57.01
とんでもない!Scalaは初心者でもウェルカムですよ!!
0012デフォルトの名無しさん2011/09/05(月) 21:54:14.00
そうやって騙すのはもう無理だと思うの
0013デフォルトの名無しさん2011/09/05(月) 22:46:55.09
そんなにたち悪いモヒカンは居ないだろ。
JavaとかRubyのモヒカンのガチのキモさに触れたら、Scalaなんぞ平和そのもの。
0014デフォルトの名無しさん2011/09/05(月) 23:14:26.13
そもそもScala周辺には人がまだ少ないから、、、。

ていうかScalaやってる人って、何作ってるの?

Webから情報収集するプログラム書きたいのだが、他言語に比べて情報が少なすぎる、、。

0015デフォルトの名無しさん2011/09/05(月) 23:29:11.96
>>14
そのくらいならまずJavaで作ってみて、書き換えていけばいいのでは?
0016デフォルトの名無しさん2011/09/06(火) 00:05:47.55
Scalaの総代将がモヒカン過ぎるのがいけないのでは?
0017デフォルトの名無しさん2011/09/06(火) 00:12:23.51
C++はハゲだけど大丈夫だよ
0018デフォルトの名無しさん2011/09/06(火) 00:31:48.06
中之条
0019デフォルトの名無しさん2011/09/06(火) 00:36:02.42
REPLからJavaクラスを実行すると、その中の
URL url = Thread.currentThread().getContextClassLoader().getResource("log4j.properties")
という箇所で、urlにnullが格納されてしまうのですが、どなたか回避をご存知でしょうか?
(当然ながら、log4j.propertiesはクラスパス上においています。)

普通にコンパイルして実行すると、urlにはlog4j.propertiesのパスがちゃんと入るのですが…。
0020デフォルトの名無しさん2011/09/06(火) 03:27:55.43
おまえらがそうやって新しい言語に飛びついてる間に、cを極めてニッチかつ専門的な分野でウマー
0021デフォルトの名無しさん2011/09/06(火) 03:35:12.89
>>19
Thread.currentThread().getContextClassLoader()
で取得されるクラスローダが別物なので。
> val url = getClass().getClassLoader().getResource("log4j.properties")
とやるとちゃんと取得できます。
0022 ◆CgacaMDhSQ 2011/09/06(火) 03:38:50.48
>>16
総大将になったつもりは無かったんですけど、モヒカン過ぎると色々摩擦を生む事自体は理解してます。
あまりモヒカン的になりすぎないようにしようとは思っているのですけど、人間、すぐには変われないですね…。
0023デフォルトの名無しさん2011/09/06(火) 06:39:24.86
けーみずさん、スルーするのも大事w
0024デフォルトの名無しさん2011/09/06(火) 07:44:28.63
総大将というより、最大限持ち上げて切り込み隊長だろww
0025デフォルトの名無しさん2011/09/06(火) 09:38:56.36
>>22
限界集落のOCaml村に煽られてもスルーできるが、
同じJVM言語仲間のGroovy村に煽られたら戦争だろうが……!
って感じですかね?
0026デフォルトの名無しさん2011/09/06(火) 17:43:27.37
>>14
情報が少ないならここで聞けばいいじゃん
0027デフォルトの名無しさん2011/09/06(火) 20:03:24.84
他の言語がクソならdisってやりゃいいんだよ
馴れ合う必要なんてないね
0028デフォルトの名無しさん2011/09/06(火) 20:05:32.01
>>27
そういう怖い人はScala使わないでください><
0029デフォルトの名無しさん2011/09/06(火) 20:13:05.51
Scala ノ ヒンイ ガ 10 サガッタ
0030デフォルトの名無しさん2011/09/06(火) 20:38:53.53
ここのモヒカンよ、これ読んで少しは見習えよ
http://journal.mycom.co.jp/articles/2011/09/05/efl2/index.html
0031デフォルトの名無しさん2011/09/06(火) 20:47:44.01
>>30
キモいもん貼るなボケ
0032デフォルトの名無しさん2011/09/06(火) 22:29:36.75
どっかに配布されているjarファイルをこんな感じで読み込もうとすると、
> scalac a.scala -cp path/*.jar
error: IO error while decoding ... with UTF-8
Please try specifying another one using the -encoding option
で数時間ハマりました。
正解は
> scalac a.scala -cp "path/*:."
だそうです。("path/*.jar:."もダメらしい)

エンコーディングとか関係ねーじゃん!
0033322011/09/06(火) 22:32:55.34
ぜんぜん関係ないですがこのスレ久々で、「モヒカン」の流れがわかりません。
誰か簡単に解説してちょ。
0034デフォルトの名無しさん2011/09/06(火) 22:39:38.71
>>33
はてな村用語。
http://mohican.g.hatena.ne.jp/keyword/%E3%83%A2%E3%83%92%E3%82%AB%E3%83%B3%E6%97%8F
「対立した文化として→ムラ社会」なんて書いてあるけど、
モヒカンが集まってムラ社会形成してるよな。
0035322011/09/06(火) 22:43:39.34
>>34
thxです。
こんな用語かってに作られて、本家(native american)は迷惑してるだろな。
0036デフォルトの名無しさん2011/09/06(火) 23:20:52.38
モヒ漢
0037デフォルトの名無しさん2011/09/07(水) 13:32:17.20
引数に型Tをとって、Tを継承した型を返す関数って
どうやって書くんだっけ?
0038デフォルトの名無しさん2011/09/07(水) 19:59:16.62
http://groups.google.com/group/clojure/browse_thread/thread/b18f9006c068f0a0?pli=1
0039デフォルトの名無しさん2011/09/07(水) 23:21:37.73
>>37
お前モヒカン村で何聞いてるの?
0040デフォルトの名無しさん2011/09/07(水) 23:42:34.16
>>38
ソースとテストケース出さずにそんな事言われても…
0041デフォルトの名無しさん2011/09/08(木) 04:12:17.13
モヒカンならソースとテストケースで事実を示して反論しよう!
0042デフォルトの名無しさん2011/09/08(木) 05:10:10.64
>>38
長いから要約して
0043デフォルトの名無しさん2011/09/08(木) 08:01:09.88
>>42
Scalaの標準のアクター実装のせいで、負荷をかけるとOut of Memoryで落ちた
Clojureで書き直してみたら負荷かけても動くようになった
さらにコードも短くなった(行数:1,000行から260行、文字数:31kから11.5k)
0044デフォルトの名無しさん2011/09/08(木) 08:55:01.95
>>37
動的型言語では簡単に出来るけど、Scalaでは出来ません。
0045デフォルトの名無しさん2011/09/08(木) 16:42:36.92
そういえばScala-Swing使ってて、ComponentのpaintComponentをオーバーライドしてGraphics2Dを描画させる時に、
イベント処理でrepaintを呼ぶと以前描画したものが消えてしまうのの回避方法ってある?

例えで言うと、マウスでクリックした所に円を描くプログラムに関して、
新たにクリックすると直前に描いた円が消えてしまう感じ。
ここで聞くなって話なら申し訳ない。
0046デフォルトの名無しさん2011/09/08(木) 17:30:41.95
>>45
描いた円を全て覚えておくか、メモリ上にビットマップ展開して、そこに円を描画。
paint(repaint含む)はメモリ上のビットマップを画面に描画するだけ

Java/scalaに限らず、GUI全般の問題やね
0047デフォルトの名無しさん2011/09/08(木) 17:57:18.52
>>46
ありがとう。GUIプログラミングについてもっと勉強し直す。
スレチに近くてスマソ。
0048デフォルトの名無しさん2011/09/08(木) 17:57:46.91
>>43
カッコだらけの時代遅れ糞言語なんて誰も使わねえよ、ばーかばーか
っていうのを翻訳して投稿しておいてくれ
0049デフォルトの名無しさん2011/09/08(木) 23:58:46.23
>>44 >>37の意味がいまいちわからない。でもこれだけはいえる

動的言語にできるという意味でなら、scalaでもできる

以上
0050デフォルトの名無しさん2011/09/09(金) 07:31:09.91
>>49
こんなことがしたいのでは?

Python

def newType(T):
    class Foo(T):
        pass
    return Foo

C++

template <class T>
class Foo : public T {
};
0051デフォルトの名無しさん2011/09/09(金) 10:52:05.68
よくわからん
0052デフォルトの名無しさん2011/09/09(金) 18:00:05.89
ゆろよろがTwitterのアイコン変えてつまらん
不細工を角度で誤魔化そうとするスイーツ臭はどこにいった
0053デフォルトの名無しさん2011/09/09(金) 18:01:59.54
そういうのはヲチ板でやってくれ
0054デフォルトの名無しさん2011/09/09(金) 18:05:16.48
だから、Scalaでこんなコードが書けたら良いなってことかと(実際は以下のようには書けない)

def newType[T:ClassManifest]() : ClassManifest[Foo[T]] = {
    class Foo[T] extends T {}
    return implicitly[ClassManifest[Foo[T]]]
}
def construct[T](t:ClassManifest[T]) : T =
{
    return t.erasure.newInstance().asInstanceOf[T]
}
val t = newType[Bar]()
val x = construct(t)


こっちはPython版
http://ideone.com/lNfZi
0055デフォルトの名無しさん2011/09/10(土) 08:17:53.06
>>49「動的言語にできるという意味でなら、scalaでもできる(キリッ」

馬鹿過ぎワロタwww
0056デフォルトの名無しさん2011/09/10(土) 08:34:26.27
静的動的でいろんな所を煽ってるいつもの人でしょ
相手にするだけ無駄
0057デフォルトの名無しさん2011/09/10(土) 11:28:47.84
静的動的で煽り合いするスレどこいったんだ?
隔離スレとして機能してたのに
0058デフォルトの名無しさん2011/09/10(土) 11:39:05.96
ScalaはRubyより劣る
Pythonより劣る
F#のような洗練された言語設計もない

どうやってつかえばいいの?
0059デフォルトの名無しさん2011/09/10(土) 11:52:17.03
無理して使わなくていいんだよ^^
0060デフォルトの名無しさん2011/09/10(土) 16:01:01.60
ジェネリックの型引数って継承できたらいいと思わない?
実体化したらそれで終わりなんて継承ツリーの中で使いにくい
自分と同じ型のメンバーを表すだけでも大変
抽象型を使ってみたが妙に不自然な書き方しか思いつかない

abstract class Base {
type TParent <: Base
var parent: Option[TParent] = None
}

class とり extends Base {
override type TParent <: とり
override def toString = "とり"
}

class とんび extends とり {
override type TParent <: とんび
override def toString = "とんび"
}

object AbstractTypeTest {
def main(args: Array[String]) = {
var とり = new とり { type TParent = とり }
とり.parent = Option(new とり { type TParent = とり })
println(とり.parent)
var とんび = new とんび { type TParent = とんび }
とんび.parent = Option(new とんび { type TParent = とんび })
println(とんび.parent)
}
}
0061デフォルトの名無しさん2011/09/10(土) 20:37:55.02
>>55 馬鹿すぎるのはお前。そもそも自分の思い込みが完全にまちがっていることにまるできずいていないwww
0062デフォルトの名無しさん2011/09/10(土) 21:42:59.38
>>61
「使うプログラミング言語により思考は制限される」
http://www.slideshare.net/yukihiro_matz/ruby-9183142
http://itpro.nikkeibp.co.jp/article/NEWS/20110909/368352/

つまり、静的厨の発想は制限されてるから
動的言語でしか出来ない事は思い浮かばないw
0063デフォルトの名無しさん2011/09/10(土) 21:47:24.37
Rubyより劣るScalaを使うと思考が制限されるよ
0064デフォルトの名無しさん2011/09/10(土) 22:00:13.97
>>62
静的言語でしかできないこともあるから
両方やれば一番いいんだよな
0065デフォルトの名無しさん2011/09/10(土) 22:36:27.47
心を落ち着けて>>56を読むんだ
0066デフォルトの名無しさん2011/09/10(土) 22:41:08.86
バイトコード操作で実行時に引数の型を継承したクラスを生成って言う風になら出来るがちょっとずれるか
0067デフォルトの名無しさん2011/09/10(土) 23:42:54.39
Rubyのような幅広い概念を取り込んで
いない言語なんてつかっちゃダメだよなぁ
0068デフォルトの名無しさん2011/09/10(土) 23:56:58.90
まあアンチがいるだけ言語発展してる証拠にもなるし微笑ましい対応で
0069デフォルトの名無しさん2011/09/10(土) 23:59:57.79
>>68
モヒカン言語らしくしろよ
0070デフォルトの名無しさん2011/09/11(日) 00:13:01.01
動的言語の方がより制限されていることにまだきづいていないようだなww
0071デフォルトの名無しさん2011/09/11(日) 00:22:03.38
>>69何故俺がD 言語住民と…!
0072デフォルトの名無しさん2011/09/11(日) 04:05:52.98
動的言語+型+静的型チェック=静的型付け言語
と考えれば、静的型付けの方がリッチだな。
いらないときは静的型チェックをはずせばいいだけ。
0073デフォルトの名無しさん2011/09/11(日) 05:30:03.22
え
0074デフォルトの名無しさん2011/09/11(日) 06:31:09.57
scala好きだけどIDEとか未熟だから止めたとかいう英語の記事かなんかが紹介されてたけど、みつけられません。
確かコンパイラ系を作ってる人の文章で、Javaと別のtoolに戻ったとか言ってました。
どんなtoolか知りたいので、もう一度その記事を教えて下さい。
0075デフォルトの名無しさん2011/09/11(日) 08:30:31.50
>>70>>72
じゃあ、Dumpクラスを継承したクラスの全ての公開メソッドに
引数と戻り値を出力する処理を追加するようなDumpクラスを
Scalaで書いてみてよ
動的言語なら10行くらいで書けるから
0076デフォルトの名無しさん2011/09/11(日) 10:44:24.56
>>75
っ AspectJ
0077デフォルトの名無しさん2011/09/11(日) 10:57:45.99
bytecode manipulationなんて卑怯ですう><
0078デフォルトの名無しさん2011/09/11(日) 11:02:13.76
>>77
そんな君にはdynamic proxy。
0079デフォルトの名無しさん2011/09/11(日) 11:47:01.83
何でも使っていいからScalaで書いてみなよ
0080デフォルトの名無しさん2011/09/11(日) 11:59:30.26
そもそもLoggingのweavingを、言語のネイティブな機能だけを使って10行で書けると何かメリットがあるのか。
0081デフォルトの名無しさん2011/09/11(日) 12:01:40.91
さすがモヒカン言語
コードは書けないが口だけは一人前
0082デフォルトの名無しさん2011/09/11(日) 12:08:27.00
Scalaだけでは書けないよ、うん、終了。
で、それが実用においてどういうデメリットがあるの? って聞いてるんだけど。
0083デフォルトの名無しさん2011/09/11(日) 13:03:24.06
またモヒカンが暴れてる
0084デフォルトの名無しさん2011/09/11(日) 13:23:30.71
>>60
暗黙的変換を使って少しましな書き方ができた
でも素直じゃない

class HasParent[TParent <: Base](any: TParent) {
def parent = any.parent
def parent_=(p: TParent) = any.parent = p
}

abstract class Base {
var parent: Base = _
}
class とり extends Base {
override def toString = "とり"
}
class とんび extends とり {
override def toString = "とんび"
}

object AbstractTypeTest {
implicit def toHasParent[T <: Base](any: T): HasParent[T] = new HasParent[T](any)
def main(args: Array[String]) = {
var とり = new とり
とり.parent = new とり
println(とり.parent)
var とんび = new とんび
とんび.parent = new とんび
println(とんび.parent)
}
}
0085デフォルトの名無しさん2011/09/11(日) 14:05:16.68
>>83
自分の思い通りにならないとモヒカンのせいにするのはよくないな。
0086デフォルトの名無しさん2011/09/11(日) 14:09:56.28
スカラって10回言って。


スカラ
スカラ
スカラ
スカラ
スカラ
スカラ
スカラ
スカラ
スカラ
スカラ

巣から落ちた鳥は?

カラス!
0087デフォルトの名無しさん2011/09/11(日) 14:26:26.20
死ねよ
0088 ◆CgacaMDhSQ 2011/09/11(日) 14:29:29.51
>>60
型引数「を」スーパークラスから継承したい場合は、まさに抽象型使えってのがScala流かと思います。あと、
ジェネリックで型引数を継承できるようにしたとして、ややこしくなるだけな気がします。型引数はメンバ
じゃないので、本来継承できるべきものじゃないですし。

あと、ここで「とび」や「とんび」クラスをさらに継承する必要が無いなら、
override type TParent <: とび
じゃなくて、
override type TParent = とび
にしてしまった方がいいのではないかと。そうすれば、new とび { type TParent = とび } じゃなくて、単にnew とび
と書けますし。
0089デフォルトの名無しさん2011/09/11(日) 14:38:16.65
スクルト
0090デフォルトの名無しさん2011/09/11(日) 14:38:37.60
モヒカンだ助けてくれぇ
0091デフォルトの名無しさん2011/09/11(日) 15:41:54.64
みんな飽きてるのにずっとモヒカン言ってるのっていつもの知的障害の人?
009260,882011/09/11(日) 17:01:16.07
>>88
ありがとうございます
override type TParent = とび
継承する必要がないのならこの方がよいのはわかります
それだと継承の可能性を閉じてしまいますのであえてあの書き方にしました
009360,882011/09/11(日) 17:04:08.90
変数の変位(代入互換性)の問題は残るのですが、
こんな書き方が許されたらと思いました

abstract class Base {
type TParent <: Base
var parent: Option[TParent] = None
}

class とり extends Base {
override type TParent = とり //ここで指定しても派生クラスで継承できる
override def toString = "とり"
}

class とんび extends とり {
override type TParent = とんび //ここで指定しても派生クラスで継承できる
override def toString = "とんび"
}

object AbstractTypeTest {
def main(args: Array[String]) = {
var とり = new とり
とり.parent = Option(new とり)
println(とり.parent)
var とんび = new とんび
とんび.parent = Option(new とんび)
println(とんび.parent)
}
}
009460,842011/09/11(日) 17:18:37.67
60,88→60,84 間違った失礼
0095デフォルトの名無しさん2011/09/11(日) 20:14:05.28
静的型チェックはずせばいいだけw
0096uy2011/09/11(日) 21:49:39.13
>>94
ゴミだから間違えるんだよな

お前みたいな奴はプログラムで変なミスするよ

むいてない 死んだほうがいい しんだほうが いい
0097デフォルトの名無しさん2011/09/11(日) 22:10:44.72
>>96
welcome to http://hibari.2ch.net/test/read.cgi/tech/1312201995/
0098デフォルトの名無しさん2011/09/11(日) 23:51:17.55
Scalaだけでは書けないよ、うん、終了(キリッ
0099デフォルトの名無しさん2011/09/12(月) 02:34:06.66
http://krautchan.net/files/1315760995001.jpg
↑糞言語の開発者 メガネ、ハゲ、ヒゲなどが特徴

http://lamp.epfl.ch/~odersky/images/Martin.JPG
↑神言語の開発者 なんというナイスガイ!
0100デフォルトの名無しさん2011/09/12(月) 07:02:18.99
プログラム板って何か変なのが住み着いてるんだな。
0101デフォルトの名無しさん2011/09/12(月) 08:12:06.06
ハゲが二人いる
■ このスレッドは過去ログ倉庫に格納されています