A contínua de chamada com corrente pode ser implementada apenas com lambdas e fechamentos?
-
26-09-2019 - |
Pergunta
Alguém sabe se call/cc
Pode ser implementado apenas com lambdas e fechamentos?
Parece que call/cc
interrompe o fluxo do programa (como uma exceção), mas lambdas e fechamentos não podem fazer isso. Portanto, eu acho call/cc
Não pode ser implementado via Lambdas e fechamentos.
Mais alguma idéia?
Solução
A questão não é particularmente clara, já que o que exatamente "implementou apenas com lambdas e fechamentos" significa?
De qualquer forma, as continuações podem ser usadas em qualquer idioma com fechamento, escrevendo manualmente em estilo de passagem de continuação. Em seguida, a tradução automática para este formulário pode ser implementada, estendendo o compilador, que os LISPs normalmente permitem no nível do usuário através de macros. Por exemplo, veja Cl-Cont-cont, uma biblioteca que implementa continuações para o Common Lisp, que é um idioma que não as possui.
É provável que continuações generalizadas eficientes, como no esquema, sejam implementadas em um nível mais baixo, lidando diretamente com a pilha do programa, mas esse não é um requisito, apenas uma otimização.
Outras dicas
No esquema, você pode implementar call/cc
Usando lambdas ao converter para o estilo de passagem de continuação (CPS). Ao se converter em CPS, toda ocorrência de call/cc
pode ser substituído pelo seguinte equivalente:
(lambda (f k) (f (lambda (v k0) (k v)) k))
Onde k
é a continuação a ser salva e (lambda (v k0) (k v))
é o procedimento de escape que restaura essa continuação (qualquer continuação k0
Isso é ativo quando chamado, é descartado).
Então, para responder sua pergunta para esquema: sim, isso pode ser feito.