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