Quelqu'un peut-il s'il vous plaît expliquer cette continuation dans le schéma?
-
22-07-2019 - |
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))
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 valeurcont
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