シンタックスシュガーの展開後の確認方法

val seq = for(x <- 1 to 100; y <- 1 to 100; if y == x * x) yield (x, y)

実は,map,flatMap,filterのシンタックスシュガーらしい.

どーいう風に展開されてるのか,知りたい.

http://d.hatena.ne.jp/matt-k/20080511#p2

について・・・

実はすでに、mizushimaさんが


展開結果は

(1 to 100).flatMap{ case x => (1 to 100).filter((y) => y == x * x).map{ case y => (x, y) } }

となります。

2008-05-12

と、丁寧に解説して下さっているのだが、

scalac のオプション探検:Rainy Day Codings:So-net blog

に書いてある方法を使うと、英文マニュアルに弱い私のような人でも、確認ができる。

まず、

object For {
  val seq = for(x <- 1 to 100; y <- 1 to 100; if y == x * x) yield (x, y)
}

といったようなソースファイル「for.scala」を用意して、
おもむろに

scalac -Xprint:namer for.scala

と実行する・・・と、

package  {
  final object For extends scala.ScalaObject {
     :
    val seq = 1.to(100).flatMap(((x) => 1.to(100).filter(((y) => y.$eq$eq(x.$times(x)))).map(((y) => scala.Tuple2(x, y)))))
  }
}

と、(若干みにくいですが)mizushimaさんとほぼ同じ展開結果が確認できます。