ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

ScalaコミュのFutureProxy: 高階関数

  • mixiチェック
  • このエントリーをはてなブックマークに追加
最近新しいトピックスがないので、書こうと思っていたのですが....
(そう思っているうちに2つのトピックスに先を越されました)

Scalaのメソッドで引数に関数を使うとJavaのreflection APIではうまく取れません。
def abc(ffff: String => int) = {123}

public int abc(scala.Function1) {...}
になります。

(既出かもしれませんが)このScala固有の情報は.classファイルのAttributes_infoにScalaSigという名前でTreeの形で入っています(らしい)。
--- ClassfileParser.scalaを参考に適当に解析した結果---
Attribute2 name ScalaSig
Major Version 4
Minor Version 1
Number of Tags 58
Tag 0 CLASSsym 4
00000000: 01 02 00 05 ::
Tag 1 TYPEname 6
00000000: 4d 61 69 6e 31 30 :: Main10
.......
-------------------------------------------------
ここからTreeを生成してFutureProxyに反映させるつもりです。(本当はannotationで@futureproxyとかしてコンパイラ(プリプロセッサ?)でやると美しいと思いますが)

Treeついでに、scalac -Yprint:xxxxx とするとソースコードが各PhaseでどうTreeとして表されるかがGUIで表示されます。(-Xprint:xxxxxは変換された(ソース)コード(情報)が文字列で出ますが)

コメント(2)

その後ですが、

class Main10[+T1, -T2] {
def xyz[T1, T2 <% String](p1:T1) = {p1}
}

に対して

class Main10FutureProxy[+T1 >: scala.Nothing <: scala.Any, -T2 >: scala.Nothing <: scala.Any](target: Main10[T1, T2]) extends FutureProxy {

def xyz[T1 >: scala.Nothing <: scala.Any, T2 >: scala.Nothing <: scala.Any](param0: T1)(implicit param1: scala.Function1[T2, scala.Predef.String]): Future[T1] = {...}
....
}

と、とりあえず型に厳しいScalaらしくうまくいきます。ByNameもサポートしました。
が、
var future5: myfuture.Future[String] = main10.xyz("main10.futureXyz");
がうまくいきません。(HelloWorldはうまくいきます)
Typers.scalaを変えて、返り値の型をFutureProxyのFutureにした場合、implicit conversionしてくれるようにしたのですが、型パラメータがある場合もう一ひねりいりそうです。(型パラメータがないHelloWorldはうまくいくので)


少しずつScalaの輪も広がっているようで。
自己フォローです。

var future5: myfuture.Future[String] = main10.xyz("main10.futureXyz");

var future5: myfuture.Future[String] = aa.Main10FutureProxy.main102main10FutureProxy[String, String](main10).xyz[java.lang.String, Nothing]("main10.futureXyz")({
((eta$0$6: scala.runtime.RichString) => scala.this.Predef.forceRandomAccessCharSeq(eta$0$6))
});
こんな感じになりました。

Apply(Select(...))だけでなく、Apply(TypeApply(Select(...)))をサポートしました。まだありそうですが、少しずつやってみます。

訂正: -Yprint:xxxxxではなく-Ybrowse:xxxxxです


ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Scala 更新情報

Scalaのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。