Pergunta

Estou aprendendo continuações, mas não posso envolver minha cabeça em torno deste código. Por que ele entrar em loop infinito?

(let ((cont #f))
  (call/cc (lambda (k)
             (set! cont k)))
  (cont #f))
Foi útil?

Solução

Linha por linha:

  • definimos cont variável local
  • chamamos com a continuação atual alguma função lambda, ou seja, estamos passando a continuação atual para a função lambda como um argumento. continuação atual é uma função de um argumento, esse argumento é então usado como um "valor de retorno" de call/cc (e aqui é eventualmente ignorado).
  • Assim k aqui significa tudo, que vai acontecer depois, no nosso caso algo próximo no sentido (lambda (call/cc-retval) (let () call/cc-retval (cont #f))). Nós definir o valor cont para essa continuação. call/cc retornos.
  • Uma vez que cont agora é uma função que representou a continuação, e do argumento é o "valor de retorno de chamada / cc", que acabamos de chamar essa função, o argumento é ignorado, e precisamos chamar o (cont #f) novamente.

Assim, o que temos, eventualmente, é o loop infinito.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top