KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
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 recurs 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.
Tags (comma-separated)
Save Edits
Cancel