Pregunta

Estoy teniendo algunos problemas para comprender el comportamiento de la siguiente programa de esquema:

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

A mi entender, c se une a la continution creado justo antes de "(pantalla 'X)".

Pero el uso de c parece modificarse a sí mismo! El definen anteriormente grabados (como esperaba) IN, X y OUT:

IN
X
OUT

Y es un procedimiento:

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

Ahora, yo esperaría que cuando se le llama de nuevo, X sería impresa, y no es!

#;3> (c)
IN
OUT

Y ahora C no es un procedimiento más, y una segunda invocación de c no funcionará!

#;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)    <--

Yo estaba esperando que cada invocación a (c) haría lo mismo - de impresión en, X, y por fuera. ¿Qué me falta?

¿Fue útil?

Solución

La ejecución de este en la raqueta es un poco más útiles:

-> (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

Nota específicamente que c se une a un valor de continuidad - debido a sus declaraciones de expresión k como el valor. Y k sí es la continuación de la expresión de valor, lo que significa que esta continuación es la espera de obtener un valor que quedará vinculado a c. Así que lo alega, requiere un único valor, ya que requiere la raqueta, lo que ayuda a aclarar lo que sucede aquí (MIT Esquema parece en silencio lo tratan como no especificada). De todos modos, la aplicación de esta continuación en 99 significa que el valor de retorno de esa expresión es 99 - por lo que saltar de nuevo en el contexto (IN impresión) y regresar 99 en obligarse a c , e imprimir en OUT su salida. Ahora usted ha modificado c tener ese lugar 99, por lo que no se puede llamar una tercera vez.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top