Domanda

Sto avendo qualche difficoltà a comprendere il comportamento dei seguenti programma di schema:

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

A quanto ho capito, c sarà vincolata al continution creato a destra prima "(display 'X)".

Ma usando c sembra modificarsi! La definiscono sopra le stampe (come mi aspettavo) IN, X e OUT:

IN
X
OUT

Ed è una procedura:

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

Ora, mi aspetto che quando viene chiamato di nuovo, X sarebbe stato stampato, e non è!

#;3> (c)
IN
OUT

E ora c non è una procedura più, e una seconda invocazione di c non funzionerà!

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

Mi aspettavo che ogni invocazione a (c) farebbe la stessa cosa - Stampa in, X, e OUT. Che cosa mi manca?

È stato utile?

Soluzione

L'esecuzione di questo in Racket è un po 'più 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

Si noti in particolare che c viene associato a un valore di continuazione - perché i vostri ritorni di espressione k come valore. E k stessa è la continuazione del valore di espressione, il che significa che questo seguito è quella attesa per ottenere un valore di essere vincolato a c. Così invocando richiede un singolo valore, come Racket richiede, che aiuta a chiarire ciò che accade qui (MIT Scheme sembra trattare in silenzio come non specificato). In ogni caso, l'applicazione di questa continuazione su 99 significa che il valore restituito da questa espressione è 99 - così si salta di nuovo nel contesto (IN stampa) e ritorno 99 ad essere vincolati a c , e stampare su OUT la via d'uscita. Hai ora modificato c avere che il 99, invece, quindi non si può chiamare una terza volta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top