Benutzerdefinierter Ausdruck "let" in Scala

Ich würde gerne habenlet Konstrukt ähnlich dem in Haskell in Scala. Ich habe ein paar Möglichkeiten ausprobiert, aber keine scheint gut zu sein. Hier ist ein Code:

object CustomLet extends App {
  val data = for (i <- 1 to 1024; j <- 1 to 512) yield (i % j) * i * (i + 1) - 1

  def heavyCalc() = { println("heavyCalc called"); data.sum }

  def doSomethingWithRes(res: Int) = {
    println(s"${res * res}")
    1
  }

  def cond(value: Int): Boolean = value > 256

  // not really usable, even though it's an expression (2x heavyCalc calls)
  def withoutLet() = if (cond(heavyCalc())) doSomethingWithRes(heavyCalc()) else 0

  // not an expression
  def letWithVal(): Int = {
    val res = heavyCalc()
    if (cond(res)) doSomethingWithRes(res)
    else 0
  }

  // a lot of code to simulate "let", at least it is an expression
  def letWithMatch(): Int = heavyCalc() match {
    case res => if (cond(res)) doSomethingWithRes(res) else 0
  }

  // not perfect solution from
  // http://stackoverflow.com/questions/3241101/with-statement-equivalent-for-scala/3241249#3241249
  def let[A, B](param: A)(body: A => B): B = body(param)

  // not bad, but I'm not sure if it could handle more bindings at once
  def letWithApp(): Int = let(heavyCalc()) {res => if (cond(res)) doSomethingWithRes(res) else 0}

  List[(String, () => Int)](
    ("withoutLet", withoutLet),
    ("letWithVal", letWithVal),
    ("letWithMatch", letWithMatch),
    ("letWithApp", letWithApp)
  ).foreach(
    item => item match {
      case (title, func) => {
        println(s"executing $title")
        val ret = func()
        println(s"$title finished with $ret")
        println()
      }
    }
  )
}

Dies ist der ideale Look davon (mit nur einer Bindung könnten mehr durch getrennt werden,; nicht sicher über diein Stichwort):

  // desired look
  def letTest(): Int =
    let res = heavyCalc() in
      if (cond(res)) doSomethingWithRes(res) else 0

Ich bin mir nicht sicher, ob es möglich ist, aber ich habe keine Erfahrung mit den meisten fortgeschrittenen Scala-Sachen wie Makros, also kann ich es nicht wirklich sagen.

EDIT1: Um klar zu sein, die wichtigsten Dinge, die ich davon erwarte, sind: SeinAusdruck und relativeinfache Syntax (wie oben beschrieben).

Antworten auf die Frage(2)

Ihre Antwort auf die Frage