亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

獲得Scala的/理解表達的貶義部分?

獲得Scala的/理解表達的貶義部分?

海綿寶寶撒 2019-12-26 08:50:54
有人知道在for / comprehension表達式實際嘗試在REPL(或編譯器)中進行編譯之前,該如何獲得for / comprehension表達式的(僅限于Scala部分)經過簡化的翻譯?到目前為止,我唯一發現的是編譯器的“ -print”標志,但這為您提供了完整的Scala翻譯…
查看完整描述

3 回答

?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

正如我在另一個主題中已經說過的那樣,scalac -print打印出scala代碼,而不是java。它將所有與Java不直接兼容的scala關鍵字轉換為普通的scala代碼。讓編譯器僅翻譯部分afaik是不可能的。但基本上,理解力總是以相同的方式翻譯。


這樣的簡單/收益


for(x <- List(1,2,3)) yield x*x

將被翻譯成


List(1,2,3).map {x => x*x}

而且沒有產量


for(x <- List(1,2,3)) println(x)


List(1,2,3).foreach{x => println(x)}

嵌套的fors將轉換為嵌套的flatMap / map構造


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

  }

}

所以絕對沒有魔術


查看完整回答
反對 回復 2019-12-26
?
慕神8447489

TA貢獻1780條經驗 獲得超1個贊

在REPL中似乎不存在直接對“ for / comprehension”表達式進行解糖的任何可能性。但是作為一種替代方案,可以使用一些Scala編譯器選項,例如“ -print”或簡單表達式“ Xprint:typer -e”


例:


要從文件獲取desugard輸出,請使用“ -print”標志:


# scala -print file.scala

要對一個簡單的單線表達式進行解糖,請使用“ -Xprint:typer -e”標志:


# scala -Xprint:typer -e "for (i <- 0 to 100) yield i"


查看完整回答
反對 回復 2019-12-26
?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

宏呢?


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

可以根據您的要求直接在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])

它也適用于其他任意表達式。


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))

}

這可能是您最接近所要查詢的內容,而不必隨時將數據編譯或轉儲到文件中。您可以直接在REPL中定義宏,也可以在通過:load命令加載的外部文件中定義宏。

查看完整回答
反對 回復 2019-12-26
  • 3 回答
  • 0 關注
  • 470 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號