Embora o Clojure não tenha continuações ou corotinas de primeira classe incorporadas como um recurso principal, é possível implementar o seu próprio.
Por exemplo, core.async é uma biblioteca Clojure que implementa o modelo CSP (Concurrent Sequential Processes). Ele usa uma gomacro para transformar o código em uma máquina de estado. Embora não sejam exatamente as rotinas em si, elas podem ser usadas para implementar os mesmos padrões.
Há também o pulley.cps , um compilador de macro que eu criei que transforma o código Clojure (via cps/ cps-fnmacros) escrito em estilo direto no estilo de passagem de continuação. Que eu saiba, é o programa Clojure com tema de continuação mais completo. Ele suporta ligação dinâmica, exceções, chamadas entre o código nativo e o transformado (embora a continuação não seja mantida entre contextos). No momento, apenas continuações abortivas (ou seja, tradicionais call-cc) são suportadas, mas tenho planos de implementar continuações delimitadas no futuro.
Embora o pulley.cps não forneça diretamente rotinas em si, call-ccé relativamente simples implementar suas próprias. De fato, um dos exemplos é uma implementação simples da multitarefa cooperativa . Isso é aprofundado no exemplo do CSP . Há também um exemplo de pingue-pongue , mas é mais um exemplo de otimização de chamada de cauda do que corotinas.
Obviamente, esses tipos de transformações são mais eficazes quando aplicados a todo o programa. Infelizmente, isso não é possível apenas com macros, localizadas. Mesmo assim, até transformações localizadas podem ser muito eficazes.