Pular para o conteúdo

A pilha

Profundidade, teto e quadros — a pilha tinha limite e não tinha como ser perguntada.

O teto de quadros é mil, e recursão legítima o atinge: uma travessia de árvore de cinco mil nós não tem nada de infinita. Quem a escreve precisa saber de quanto é o teto antes de bater nele.

dataforge
adopt Arcane.Inicio as I

action folha():
    yield I.pilha()

action tronco():
    yield folha()

p := tronco()
assert p["profundidade"] bigger_eq 2
assert p["restante"] is p["limite"] - p["profundidade"]
dataforge
adopt Arcane.Inicio as I

action quem():
    yield [q["acao"] cycle q in I.quadros()]

assert "quem" in quem()

Ajustar o teto#

dataforge
adopt Arcane.Inicio as I

antes := I.limite_da_pilha()
I.limite_da_pilha(300)
assert I.pilha()["limite"] is 300
I.limite_da_pilha(antes)

As duas saídas que a mensagem do erro traz continuam sendo as certas: yield f(…) como retorno inteiro vira salto e não tem teto (testado com 200 mil), ou um cycle com pilha explícita.

Item da literaturaAqui
stack framesI.quadros() — ação, linha e arquivo de cada um
stack overflow detectiono teto de quadros, com mensagem que diz as duas saídas
coroutine / fiber stacksas fibras são sem pilha: o contexto é o quadro do gerador
stack probes, stack guards, stack growthnão se aplica: quem gerencia a pilha é o CPython