Clojure - despedida
Existem casos em que um agente é atribuído a uma função que é de natureza bloqueadora. Um exemplo simples é, considere que você está lendo o conteúdo de um arquivo que, por si só, é bloqueador. Portanto, a função de envio retornará primeiro imediatamente o agente e continuará com a operação de arquivo. Quando a operação do arquivo for concluída, ele atualizará automaticamente o agente com o conteúdo do arquivo.
Sintaxe
A seguir está a sintaxe.
(send agentname function value)
Parameters- 'nomedagente' é o agente para o qual a função de envio está sendo redirecionada. A 'função' é usada para determinar de que maneira o valor do agente será alterado. No nosso caso, usaremos o símbolo de adição + para adicionar um valor ao valor existente do agente. 'Valor' é o valor passado para a função que, por sua vez, será usado para atualizar o valor do agente de acordo.
Return Value- Primeiro, retorna o agente como está, se houver uma função sem bloqueio. No final, retorna um objeto agente com um novo valor.
Exemplo
Um exemplo de como isso é usado é mostrado no programa a seguir.
(ns clojure.examples.example
(:gen-class))
(defn Example []
(def counter (agent 0))
(println @counter)
(send-off counter + 100)
(println @counter)
(println @counter))
(Example)
Estamos vendo o mesmo exemplo de incremento do valor do contador, mas a partir da saída a seguir ficará claro o que a função de envio faz.
Resultado
O programa acima produz a seguinte saída.
0
0
0
Pode-se ver que, embora tenhamos enviado ao agente uma função para definir o valor para 100, ele não reflete imediatamente. A função de envio primeiro retorna o valor do agente como ele é. Uma vez que o valor do agente foi definido corretamente por Clojure, o valor do agente é então atualizado e podemos ver o novo valor do agente.