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.

clojure_agents