Vous venez de tomber sur des «suites», peut-être la chose la plus difficile à comprendre pour Scheme.
call/cc
call/cc
est une abréviation de call-with-current-continuation
, ce que la procédure fait est qu'elle prend une fonction d'argument unique comme son propre argument, et l'appelle avec la 'continuation' actuelle.
Alors, quelle est la suite? C'est tristement difficile à expliquer et vous devriez probablement google pour obtenir une meilleure explication que la mienne. Mais une continuation est simplement une fonction d'un argument, dont le corps représente une certaine «continuation» d'une valeur. De même, quand nous avons (+ 2 (* 2 exp))
avec exp étant une expression aléatoire, si nous évaluons cette expression il y a une 'continuation' qui attend ce résultat, un endroit où l'évaluation continue, si elle évalue à 3 par exemple, elle insère que valeur dans l'expression (* 2 3)
et continue à partir de là avec la prochaine «continuation», ou l'endroit où l'évaluation continue, qui est .
Dans presque tous les contextes de langages de programmation, l'endroit où le calcul continue avec la valeur est au même endroit que celui commencé, bien que l'instruction return
dans de nombreuses langues soit un contre-exemple clé, la continuation est à un endroit totalement différent. déclaration de retour elle-même. Dans Scheme, vous avez un contrôle direct sur vos suites, vous pouvez les 'capturer' comme si vous y étiez. Ce que fait f
n'est rien d'autre que d'évaluer la continuation actuelle, après tout, quand (lambda (x) x)
est appelée avec la continuation en cours, elle ne fait que l'évaluer, donc tout le corps de la fonction le fait. Comme je l'ai dit, les continuations sont des fonctions elles-mêmes dont le corps peut juste être vu comme la continuation qu'elles doivent capturer, ce qui a été montré par les concepteurs de Scheme, que les continuations sont simplement des abstractions lambda. Ainsi, dans le code, f évalue d'abord à la suite de laquelle il a été appelé. Ensuite, cette continuation en tant que fonction est appliquée à 'f
(un symbole). Cela signifie que ce symbole est ramené à cette continuation, où il est à nouveau évalué comme un symbole, pour révéler la fonction à laquelle il est lié, qui est à nouveau appelé avec un symbole comme argument, qui est finalement affiché.
Type d'esprit ahurissant, si vous avez vu l'amorce ", peut-être le film ceci explique cela:
http://thisdomainisirrelevant.net/1047
merci beaucoup pour l'explication et le lien! – shaku