Я пишу простой интерпретатор в Scala.
Этот интерпретатор хранит то, что по сути является List[List[(Symbol, Value)]]
средой:
case class Env(frames: List[Frame]) {
def lookup(s: LSymbol): Option[Value] = ??? // help
}
case class Frame(associations: List[(LSymbol, Value)]){
def find(s: LSymbol): Option[Value] = {
this.associations.collectFirst {case (s1, v) if s1 == s => v}
}
}
Я бы по сути хотел найти в каждом кадресоответствующий символ по очереди.Хотя для этого достаточно просто написать для этого небольшую хвостовую рекурсивную функцию поиска, она выглядит как нечто, что можно было бы сделать более эффективно и в целом с использованием однострочного collectFirst
, например:
def lookup(s: LSymbol): Option[Value] =
this.frames.collectFirst{
case frame if frame.find(s).nonEmpty => frame.find(s).get
}
ОднакоЭто избыточно делает работу во втором frame.find(s)
.Есть ли способ сделать этот поиск кратким, не расточительным?