Question

Je suis la difficulté à comprendre le comportement des éléments suivants Programme d'intégration:

(define c
  (dynamic-wind
    (lambda () (display 'IN)(newline))
    (lambda () (call/cc (lambda (k)
                     (display 'X)(newline)
                     k)))
    (lambda () (display 'OUT)(newline))))

Si je comprends bien, c sera lié au continution créé juste avant "(affichage « X)".

Mais en utilisant c semble se modifier! DEFINE ci-dessus prints (comme je m'y attendais) IN, OUT et X:

IN
X
OUT

Et il est une procédure:

#;2> c
#<procedure (a9869 . results1678)>

Maintenant, je pense que quand il est appelé à nouveau, X sera imprimé, et ce n'est pas!

#;3> (c)
IN
OUT

Et maintenant c est pas une procédure plus, et un second invokation de c ne fonctionnera pas!

#;4> c    ;; the REPL doesn't answer this, so there are no values returned
#;5> (c)

Error: call of non-procedure: #<unspecified>

        Call history:

        <syntax>            (c)
        <eval>              (c)    <--

Je me attendais à ce que chaque invokation à (c) ferait la même chose - imprimer IN, X et OUT. Qu'est-ce que je manque?

Était-ce utile?

La solution

L'exécution de cette Racket est un peu plus utile:

-> (define c
     (dynamic-wind
       (lambda () (display 'IN)(newline))
       (lambda () (call/cc (lambda (k)
                             (display 'X)(newline)
                             k)))
       (lambda () (display 'OUT)(newline))))
IN
X
OUT
-> c
#<continuation>
-> (c)
IN
OUT
define-values: context (defining "c") expected 1 value, received 0 values
-> (c 99)
IN
OUT
-> c
99

Notez spécifiquement que c se lie à une valeur de continuation - parce que vos déclarations d'expression k comme valeur. Et k lui-même est la continuation de l'expression de la valeur, ce qui signifie que cette suite est une attente pour obtenir une valeur d'être lié à c. Donc, il faut invoquer une seule valeur, comme Racket exige, ce qui permet de clarifier ce qui se passe ici (MIT Scheme semble traiter en silence comme non spécifié). Quoi qu'il en soit, l'application de cette poursuite sur 99 signifie que la valeur de retour de cette expression est de 99 - donc vous sauter de nouveau dans le contexte (impression IN) et retour 99 être lié à c , et d'imprimer OUT sur votre chemin. Vous avez maintenant modifié c avoir que 99 à la place, de sorte que vous ne pouvez pas appeler une troisième fois.

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