3 回答

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊
正如我在另一個(gè)主題中已經(jīng)說過的那樣,scalac -print打印出scala代碼,而不是java。它將所有與Java不直接兼容的scala關(guān)鍵字轉(zhuǎn)換為普通的scala代碼。讓編譯器僅翻譯部分afaik是不可能的。但基本上,理解力總是以相同的方式翻譯。
這樣的簡(jiǎn)單/收益
for(x <- List(1,2,3)) yield x*x
將被翻譯成
List(1,2,3).map {x => x*x}
而且沒有產(chǎn)量
for(x <- List(1,2,3)) println(x)
至
List(1,2,3).foreach{x => println(x)}
嵌套的fors將轉(zhuǎn)換為嵌套的flatMap / map構(gòu)造
for(x <- List(1,2,3); y <- List(4,5,6)) yield x*y
將被翻譯成
List(1,2,3).flatMap { x =>
List(4,5,6).map { y =>
x*y
}
}
所以絕對(duì)沒有魔術(shù)

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超1個(gè)贊
在REPL中似乎不存在直接對(duì)“ for / comprehension”表達(dá)式進(jìn)行解糖的任何可能性。但是作為一種替代方案,可以使用一些Scala編譯器選項(xiàng),例如“ -print”或簡(jiǎn)單表達(dá)式“ Xprint:typer -e”
例:
要從文件獲取desugard輸出,請(qǐng)使用“ -print”標(biāo)志:
# scala -print file.scala
要對(duì)一個(gè)簡(jiǎn)單的單線表達(dá)式進(jìn)行解糖,請(qǐng)使用“ -Xprint:typer -e”標(biāo)志:
# scala -Xprint:typer -e "for (i <- 0 to 100) yield i"

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
宏呢?
import scala.reflect.macros.Context
import scala.reflect.runtime.universe._
import scala.language.experimental.macros
def _desugar(c : Context)(expr : c.Expr[Any]): c.Expr[Unit] = {
import c.universe._
println(show(expr.tree))
reify {}
}
def desugar(expr : Any) = macro _desugar
可以根據(jù)您的要求直接在REPL中使用:
scala> desugar { for(i <- List(1,2,3,4,5)) yield i }
immutable.this.List.apply[Int](1, 2, 3, 4, 5).map[Int, Any](((i: Int) =>
i))(immutable.this.List.canBuildFrom[Int])
scala> desguar { for(i <- (0 to 10) if (i > 5)) yield i }
scala.this.Predef.intWrapper(0).to(10).withFilter(((i: Int) => i.>(5))).map[Int,
Any](((i: Int) => i))(immutable.this.IndexedSeq.canBuildFrom[Int])
它也適用于其他任意表達(dá)式。
scala> desugar {
| val x = 20
| val y = 10
| println(x + y)
| }
{
val x: Int = 20;
val y: Int = 10;
scala.this.Predef.println(x.+(y))
}
這可能是您最接近所要查詢的內(nèi)容,而不必隨時(shí)將數(shù)據(jù)編譯或轉(zhuǎn)儲(chǔ)到文件中。您可以直接在REPL中定義宏,也可以在通過:load命令加載的外部文件中定義宏。
- 3 回答
- 0 關(guān)注
- 467 瀏覽
添加回答
舉報(bào)