Est-il possible de mettre en Scala quelque chose d'équivalent pour le python yield
déclaration où il se souvient de l'état local de la fonction où elle est utilisée et "donne" la valeur suivante à chaque fois qu'il est appelé?
Je voulais avoir quelque chose comme cela pour convertir une fonction récursive dans un itérateur. Un peu comme ceci:
# 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
Sauf, foo
peut être plus complexe et de manière récursive par certains acyclique objet graphique.
Édition Supplémentaire: Permettez-moi d'ajouter un exemple plus complexe (mais toujours simple): Je peux écrire une simple fonction récursive, l'impression des choses au fur et à mesure:
// 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 + " ")
}
}
}
Idéalement, je voudrais avoir une bibliothèque qui me permet de changer facilement un peu de déclarations et de le faire travailler comme un Itérateur:
// 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
}
}
Il semble suites permettent de le faire, mais je ne comprends juste pas l' shift/reset
concept. Va continuation, à terme, dans le compilateur et serait-il possible d'extraire de la complexité dans une bibliothèque?
Edit 2: vérifier Riche de réponse dans l'autre thread.