Pergunta

Então eu acredito que eu entendo continuações agora, pelo menos em algum nível, graças ao esquema comunidade wiki e Saiba Esquema em Fixnum Dias .

Mas eu gostaria de mais prática -. Isto é, mais exemplo de código que pode trabalhar através da minha cabeça (de preferência planejado, então não há coisas estranhas para distrair a partir do conceito)

Especificamente , eu gostaria de trabalho através de mais problemas com continuações que currículo e / ou co-rotinas, ao invés de apenas usá-los para sair de um loop ou qualquer outra coisa (que é bastante simples).

De qualquer forma, se você souber de bons tutoriais, além de os que eu link acima, ou se gostaria de postar algo que você escreveu que seria um bom exercício, eu ficaria muito grato!

Foi útil?

Solução

Sim, continuações pode ser bastante mente-flexão. Aqui está um bom quebra-cabeça eu encontrei um tempo atrás - para tentar descobrir o que está impresso e por que:

(define (mondo-bizarro)
  (let ((k (call/cc (lambda (c) c)))) ; A
    (write 1)
    (call/cc (lambda (c) (k c))) ; B 
    (write 2)
    (call/cc (lambda (c) (k c))) ; C
    (write 3)))

(mondo-bizarro)

explicação de como funciona este (contém spoilers!):

  1. As primeiras lojas call/cc retorna a sua própria continuação e armazena em k.
  2. O 1 número está escrito na tela.
  3. A continuação atual, que é para continuar no ponto B, é devolvida ao k, que retorna para A
  4. Desta vez, k é agora obrigado a continuação temos no B
  5. O 1 número é escrito novamente para a tela
  6. A continuação corrente, que está a continuar no ponto B, é devolvido para K, que é outra continuação (mas diferente) para outro ponto B
  7. Uma vez que estamos de volta na continuação original, é importante notar que aqui k ainda é obrigado a A
  8. O 2 número é escrito à tela
  9. A continuação atual, que é para continuar no ponto C, é devolvida ao k, que retorna para A
  10. Desta vez, k é agora obrigado a continuação temos no C
  11. O 1 número é escrito novamente para a tela
  12. A continuação corrente, que está a continuar no ponto B, é retornado a k, que retorna para C
  13. O 3 número é escrito à tela
  14. E você está feito

Portanto, a saída correta é 11213. O ponto comum degola mais eu coloquei em negrito - é importante notar que quando você usa continuações para 'redefinir' o valor de k que ela não afeta o valor de k de volta na continuação originais. Depois de saber que ele se torna mais fácil de entender.

Outras dicas

Brown University de linguagens de programação curso tem um href="http://cs.brown.edu/courses/csci1730/2008/Assignments/08-continuations.html" rel="nofollow noreferrer"> conjunto de problemas publicamente disponível.

scroll top