2009/07/31 23:10 に kmizushima<mizu...@gmail.com> さんは書きました:
--
Kota Mizushima
e-mail: mizu...@gmail.com
8/14の勉強会ではみなさま、ありがとうございました。
勉強会の場で聞き忘れたのですが、
みなさん、Scalaで開発するときにはどんな開発環境を
使ってらっしゃいますか。
私はVimを特に工夫もせず使っています。
作業中の工夫(?)として、
・ScalaのライブラリAPIをWindowsHelp化
・scala対話環境上でメソッドを調べたいときは
>List.getClass.getMethods.foreach(println)
などとして一覧を表示する。
といったことをしています。
みなさんが開発環境で工夫、苦労されていることが
ありましたら、教えていただけませんでしょうか。
#EclipseやNetBeansのpluginが安定してくれれば・・・
--
(株)豆蔵 小林健一
〒163-0434
東京都新宿区西新宿二丁目1番1号
新宿三井ビルディング 34階 私書箱302号
TEL: 03-5339-2165(BS事業部教育), FAX: 03-5339-1795
URL: http://www.mamezou.com/
E-mail: koba...@mamezou.com
ありがとうございます。
WindowsHelp化(chmファイル化)は巷のフリーウェアで
簡単にできます。単語検索が軽快ですのでお薦めです。
やはり普通にエディタで開発するのが一番なのか。
NetBeansもよく止まりますね。
YAMASHIRO Shunsuke さんは書きました:
勉強会(8/14)ネタの続きです。
S-99(http://aperiodic.net/phil/scala/s-99/)の問題をみんなで
考えたところ、第1問(リストの最後の要素を取得する)の回答が
いくつか出ました。
class Last {
def last1[T](l:List[Int])= l.last
def last2[T](l:List[Int]) = l.reverse.head
def last3[T](l:List[Int]) = l.reverse.first
def last4[T](l:List[Int]) = l.reduceLeft((x, y) => y)
}
いろいろできるなぁ、というだけでは面白くないので、
自分のマシンでそれぞれの関数を100万回回して
速度を調べてみました。結果は・・・
last1 577.6ms
last2 998.4ms
last3 1086.0ms
last4 817.8ms
で、組込み関数が速いのは当然かとおもいますが、
案外reduceLeftが健闘しますね。
Scalaライブラリの実装が反復ばかりなのに
「Scalaスケーラブルプログラミング」P156で、
「両者はほとんど同じ速さである」というのが気になったので、
同じ処理を反復と再帰で書いた場合の時間測定をしてみました。
手元のCore2Duo2.40GHzマシンでは、
再帰の方が1.2倍の時間がかかるようです。
確かにライブラリにとっては無視できない速度ですね。
バイトコードを見てみると、再帰のコードを
反復に変換しているわけではないようです。
毎回メソッドを呼び出してますね。
末尾再帰の最適化をやってないように見えるんですが、
どうなってるんでしょうか。
-------------------------------------------------------
public double approximate(double);
Code:
Stack=4, Locals=3, Args_size=2
0: aload_0
1: dload_1
2: invokevirtual #18; //Method isGoodEnough:(D)Z
5: ifeq 12
8: dload_1
9: goto 21
12: aload_0
13: aload_0
14: dload_1
15: invokevirtual #21; //Method improve:(D)D
18: invokevirtual #30; //Method approximate:(D)D ←ココ(@_@)
21: dreturn
LineNumberTable:
line 9: 0
line 10: 12
line 9: 21
-------------------------------------------------------
実行したコード
------------------------------------------------------------------
class Approx {
def isGoodEnough(guess:Double):Boolean =
if (guess < 1) true
else false
def improve(guess:Double): Double = guess - 1
def approximate(guess:Double):Double =
if (isGoodEnough(guess)) guess
else approximate(improve(guess))
def approximateLoop(initialGuess:Double):Double = {
var guess = initialGuess
while (!isGoodEnough(guess))
guess = improve(guess)
guess
}
}
object ApproxMain {
val app = new Approx()
def main(args:Array[String]) = {
recursive(1)
iterate(1)
recursive(1)
iterate(1)
recursive(1)
iterate(1)
recursive(10)
iterate(10)
recursive(10)
iterate(10)
recursive(100)
iterate(100)
recursive(100)
iterate(100)
recursive(1000)
iterate(1000)
recursive(1000)
iterate(1000)
}
def recursive(n:Int) = {
val start = java.lang.System.currentTimeMillis()
for (i <- 0 to 10000000) {
app.approximate(n)
}
println(java.lang.System.currentTimeMillis() - start)
}
def iterate(n:Int) = {
val start = java.lang.System.currentTimeMillis()
for (i <- 0 to 10000000) {
app.approximateLoop(n)
}
println(java.lang.System.currentTimeMillis() - start)
既に回答がありますが,overrideの可能性のため,
最適化不可能なのかと.
なので,classをobjectにするかメソッドをfinalに
すると想定したものが得られますね.
#ちなみにobjectにすると実体であるJavaの
#classがfinalになるため
以上,よろしくお願いします.
-----
NAKAMURA Tadashi
ありがとうございます。
確かにfinal def...にすると以下の通りですね。
--------------------------------------------------------
public final double approximate(double);
Code:
Stack=3, Locals=4, Args_size=2
0: aload_0
1: dload_1
2: invokevirtual #18; //Method isGoodEnough:(D)Z
5: ifeq 10
8: dload_1
9: dreturn
10: aload_0
11: dload_1
12: invokevirtual #21; //Method improve:(D)D
15: dstore_1
16: goto 0
--------------------------------------------------------
実行速度も反復とほとんど変わりません。
中村 正 さんは書きました:
--
10/2(金)19:00より、第2回Scala言語仕様輪読会を開催します。
前回参加できなかった方もぜひご参加ください。
--
第2回Scala言語仕様輪読会@scala-be
日時 / DATE :
2009/10/02 19:00 to 21:00
定員 / LIMIT :
25 人(暫定)
会場 / PLACE :
豆蔵トレーニングルーム(新宿三井ビル34階) (東京都新宿区西新宿二丁目
1番1号)
参加方法:
http://atnd.org/events/1523 から参加表明していただいた上で、会場に直
接ご来場ください。
--
リマインダです。
予定通り、10/2(金)19:00より
第2回Scala言語仕様輪読会を開催します。
前回に引き続き盛り上がって参りましょう。
Kenichi Kobayashi さんは書きました:
水島です。
昨日、今回の輪読会で読む範囲を予習してたのですが、なかなか手ごわそうです。
皆様も、当日、疑問点などがあれば遠慮無くその場でツッコんでいただければと
思います。あと、たぶん2時間だとChapter 3は読みきれない気がするので、残った
分は次回以降ということになるかもしれませんが、ご了解いただければと思います。
2009年10月1日12:26 Hanyuda Eiiti <han...@mamezou.com>:
--
--
Kota Mizushima
e-mail: hau5...@tree.odn.ne.jp,mizu...@gmail.com
鈴木です。
第2回Scala言語仕様輪読会に参加させていただき、ありがとうございました。
教えていただきたいのですが
scala> type of[m[_],t] = m[t]
defined type alias of
scala> var x: List of Int = List(1,2,3)
x: of[List,Int] = List(1, 2, 3)
この"List of Int"という表記ができることが、Scala Specのどの辺に書いてるのでし
ょうか?
よろしくお願いいたします。
tmiyaさんのおっしゃる通りで、3.2.8 Infix Typesにそのことが書かれています。
3.2.8の最初の段落から引用すると、以下の通りです。T1 op T2のように書いた場合、
op[T1, T2](今回の例で言うとof[List, Int])と同じ意味になるということですね。
> An infix type T1 op T2 consists of an infix operator op which gets applied to two
> type operands T1 and T2. The type is equivalent to the type application op[T1,T2].
> The infix operator op may be an arbitrary identifier, except for *, which is reserved
> as a postfix modifier denoting a repeated parameter type (§4.6.2).
2009年10月17日21:24 tmiya <tm...@bu.iij4u.or.jp>:
--
Kota Mizushima
e-mail: hau5...@tree.odn.ne.jp,mizu...@gmail.com
11/11(水)19:00より、第3回Scala言語仕様輪読会を開催します。
前回はかなりハードな内容でしたが、それだけに興味深い内容でした。
今度もその続きから進めていきます。
会場は今回、トレーニングルームではなく大会議室になります。
新宿三井ビル34F南側ですのでご注意ください。
------------------------------------------------------------
第3回Scala言語仕様輪読会@scala-be
Scala言語仕様をがんがん読んでみる
日時 / DATE :
2009/11/11 19:00 to 21:00
定員 / LIMIT :
20 人
会場 / PLACE :
豆蔵大会議室(新宿三井ビル34階南側) (東京都新宿区西新宿二丁目1番1号)
参加方法:
http://atnd.org/events/1865 から参加表明していただいた上で、
会場に直接ご来場ください。
ありがとうございます。確かに3.2.8 Infix Typesにありました。
3.2.8 Infix Typesは右結合のところだけに眼が行って最初の段落を見逃していました
。
ところで"two type operands T1 and T2."の"""two"""は三つ以上は、論理的に無理な
のでしょうかそれとも、使えても嬉しくないだけなのでしょうか?
> --‾--‾---------‾--‾----‾------------‾-------‾--‾----‾
> このメールは次の Google グループの参加者に送られています: scala-be
> このグループにメールで投稿: scal...@googlegroups.com
> このグループから退会する: scala-be+u...@googlegroups.com
> その他のオプションについては、次の URL からグループにアクセスしてくださ
> い。 http://groups.google.com/group/scala-be?hl=ja
> -‾----------‾----‾----‾----‾------‾----‾------‾--‾---
>
もちろん、三つ以上にすることも論理的には可能だと思います。
ただ、その場合一体どういう文法にすべきかが割と難しいところ
ではないでしょうか?たとえば、3 type operandsを持つ場合を
考えてみると:
(T1, T2) op T3
それとも
(T1) op (T2, T3) ?
他にも色々候補はあると思うんですが、どう文法を考えても
左右どっちかに偏ってしまい、なんか微妙な気がします。
2009年10月19日23:21 <tqj0...@nifty.com>:
明日11/11(水)19:00より、予定通り
第3回Scala言語仕様輪読会を開催します。
まだ座席にい余裕がある、かもしれませんので、
「忘れてた!」と言う方はあわてず、
参加登録を行ってください。
では、当日会場でお会いしましょう。
Kenichi Kobayashi さんは書きました:
アナウンスありがとうございます。
皆様:
今回は、Chapter 3の後半~Chapter 4の前半という構成になると思います。特にChapter 3後半は
ややこしいので、一通り目を通されることをお勧めします。
2009年11月10日14:59 Kenichi Kobayashi <koba...@mamezou.com>:
--
Kota Mizushima
e-mail: hau5...@tree.odn.ne.jp,mizu...@gmail.com
第3回Scala言語仕様輪読会では、結構ディスカッションが
ありました(なにしろ高階型パラメータとか
スコーレム標準形とか出まくりですし)。
私がコメントを付けたPDFを
091111_ScalaReferenceWithComment.pdf
として格納しておきました。
http://groups.google.co.jp/group/scala-be/files
次回も面白いところが続きますのでお楽しみに。
Kota Mizushima さんは書きました:
ありがとうございました。返事が遅れてすみません。
(今回参加できなくて残念です)
> 左右どっちかに偏ってしまい、なんか微妙な気がします。
確かに微妙です。
少し話は違いますが、以下を試してみたのですが
var y: List of List of Int はだめでした。(version 2.7.0)
scala> var y: List of List of Int = List(List(1,2,3), List(4,5,6))
<console>:5: error: class List takes type parameters
var y: List of List of Int = List(List(1,2,3), List(4,5,6))
^
scala> var y: List of List[Int] = List(List(1,2,3), List(4,5,6))
y: of[List,List[Int]] = List(List(1, 2, 3), List(4, 5, 6))
変な質問だと思いますが、
1 + 2
と
List of Int
は何が違うのでしょうか? operatorとtypeの違いとは何なのでしょうか?単に言語とし
て使っている分には問題ないのですが。また、どの辺まで遡れば一緒なのでしょうか?
よろしくお願いします。
----- Original Message -----
> Date: Tue, 20 Oct 2009 00:19:11 +0900
> Subject: [scala-be] Re: 第2回Scala言語仕様輪読会の内容への質問
> From: Kota Mizushima <mizu...@gmail.com>
> To: scal...@googlegroups.com
>
>
> > ?to two
> >> > type operands T1 and T2. The type is equivalent to the type application
op
> > [T1,T2].
> >> > The infix operator op may be an arbitrary identifier, except for *, whi
ch
> > is reserved
> >> > as a postfix modifier denoting a repeated parameter type (§4.6.2).
> >>
> >>
> >>
> >> 2009年10月17日21:24 tmiya <tm...@bu.iij4u.or.jp>:
> >> >
> >> > On 10月17日, 午後5:30, tqj00...@nifty.com wrote:
> >> >> この"List of Int"という表記ができることが、Scala Specのどの辺に書いて
るの
> > でし
> >> >> ょうか?
> >> >
> >> > 多分、3.2.8 Infix Type だと思います。typeに対するinfix operator を of
とい
> > う名前で定義した、という話か
> >> > と。
> >> > 型を定義する type キーワードの使い方に関しては 4.3 も参照すると良いです
。
> > (あるいは 4.4 あたりも?)
> >> >
> >> > >
> >> >
> >>
> >>
> >>
> >> --
> >> Kota Mizushima
> >> e-mail: hau5...@tree.odn.ne.jp,mizu...@gmail.com
> >>
> >> --‾--‾---------‾--‾----‾------------‾-------‾--‾----‾
> >> このメールは次の Google グループの参加者に送られています: scala-be
> >> ?このグループにメールで投稿: scal...@googlegroups.com
> >> ?このグループから退会する: scala-be+u...@googlegroups.com
> >> ?その他のオプションについては、次の URL からグループにアクセスしてくださ