Is it possible to implement in Scala something equivalent to the python yield
statement where it remembers the local state of the function where it is used and "yields" the next value each time it is called?
I wanted to have something like this to convert a recursive function into an iterator. Sort of like this:
# this is python
def foo(i):
yield i
if i > 0:
for j in foo(i - 1):
yield j
for i in foo(5):
print i
Except, foo
may be more complex and recurse through some acyclic object graph.
Additional Edit: Let me add a more complex example (but still simple): I can write a simple recursive function printing things as it goes along:
// this is Scala
def printClass(clazz:Class[_], indent:String=""): Unit = {
clazz match {
case null =>
case _ =>
println(indent + clazz)
printClass(clazz.getSuperclass, indent + " ")
for (c <- clazz.getInterfaces) {
printClass(c, indent + " ")
}
}
}
Ideally I would like to have a library that allows me to easily change a few statements and have it work as an Iterator:
// this is not Scala
def yieldClass(clazz:Class[_]): Iterator[Class[_]] = {
clazz match {
case null =>
case _ =>
sudoYield clazz
for (c <- yieldClass(clazz.getSuperclass)) sudoYield c
for (c <- clazz.getInterfaces; d <- yieldClasss(c)) sudoYield d
}
}
It does seem continuations allow to do that, but I just don't understand the shift/reset
concept. Will continuation eventually make it into the main compiler and would it be possible to extract out the complexity in a library?
Edit 2: check Rich's answer in that other thread.