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?

Foi útil?

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.

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