Question

J'apprends les continuations mais je ne peux pas comprendre ce code. Pourquoi passe-t-il en boucle infinie?

(let ((cont #f))
  (call/cc (lambda (k)
             (set! cont k)))
  (cont #f))
Était-ce utile?

La solution

Ligne par ligne:

  • nous définissons la variable locale cont
  • nous appelons avec la continuation actuelle une fonction lambda, c’est-à-dire que nous passons la continuation actuelle à la fonction lambda en tant qu’argument. La continuation actuelle est une fonction de 1 argument, cet argument est ensuite utilisé comme "valeur de retour". call / cc (et est finalement ignoré).
  • Donc k signifie ici tout ce qui se passera après, dans notre cas quelque chose de proche du sens de (lambda (call / cc-retval) (let () call / cc-retval (cont #f))) . Nous définissons la valeur cont sur cette continuation. call / cc renvoie.
  • Puisque cont est maintenant une fonction qui représente la suite et que son argument est la "valeur renvoyée de call / cc", nous appelons simplement cette fonction, l'argument est ignoré et nous avons besoin appeler à nouveau le (cont #f) .

Ainsi, nous obtenons finalement une boucle infinie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top