Ho scritto un piccolo interprete Scheme in C# e mi sono reso conto che il modo in cui l'avevo implementato, era molto facile aggiungere supporto per le corrette continuazioni.Esempio più semplice di continuazioni all'indietro in Schema senza mutazione esplicita
Quindi li ho aggiunti ... ma voglio "provare" che il modo in cui li ho aggiunti è corretto.
Il mio interprete di Schema tuttavia non supporta lo stato "mutante": tutto è immutabile.
quindi era piuttosto facile scrivere uno unit test per esporre "verso l'alto" continuazioni:
AssertEqual(Eval("(call/cc (lambda (k) (+ 56 (k 3))))"), 3);
Tuttavia, ho anche voglia di scrivere uno unit test che dimostra che se la continuazione "sfugge", quindi che ancora lavora troppo:
AssertEqual(Eval("(call/cc (lambda (k) k))", <some continuation>);
Ma, naturalmente, quanto sopra sarebbe solo verificare che "ho avuto una continuazione" ... non che in realtà è una continuazione valida.
Tutti gli esempi che riesco a trovare, tuttavia, finiscono sempre per utilizzare "set!" per dimostrare la continuazione evasa.
Qual è l'esempio Scheme più semplice che dimostra il supporto adeguato per le continue all'indietro senza fare affidamento sulla mutazione?
Le sequenze all'indietro sono utilizzabili senza mutazione? Comincio a sospettare che non lo siano, perché potresti solo usarlo per eseguire di nuovo lo stesso calcolo ... che è privo di significato se non ci sono effetti collaterali. È per questo che Haskell non ha continuazioni?
Hey che è pulito! Penso ... Ho bisogno di capire cosa diavolo fa ora !!! ;-) –
OK Ho capito ora ... È molto intelligente! E dimostra un uso reale: il looping senza ricorsione esplicita. –
Giusto. Ovviamente, chiunque abbia familiarità con il combinatore Y ti dirà che non hai bisogno di continuazioni per questo, ma forse posso inventare qualcosa che non è così ovvio. –