シンタックスシュガーの展開後の確認方法
val seq = for(x <- 1 to 100; y <- 1 to 100; if y == x * x) yield (x, y)実は,map,flatMap,filterのシンタックスシュガーらしい.
どーいう風に展開されてるのか,知りたい.
について・・・
実はすでに、mizushimaさんが
:
展開結果は(1 to 100).flatMap{ case x => (1 to 100).filter((y) => y == x * x).map{ case y => (x, y) } }となります。
と、丁寧に解説して下さっているのだが、
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さんとほぼ同じ展開結果が確認できます。