Clojure - addio
Ci sono casi in cui a un agente viene assegnata una funzione di natura bloccante. Un semplice esempio è, considera che stai leggendo i contenuti da un file che a sua volta sta bloccando in natura. Quindi la funzione di invio prima restituirà immediatamente l'agente e continuerà con l'operazione sul file. Quando l'operazione sul file viene completata, aggiornerà automaticamente l'agente con il contenuto del file.
Sintassi
Di seguito è riportata la sintassi.
(send agentname function value)
Parameters- "agentname" è l'agente a cui viene reindirizzata la funzione di invio. La "funzione" viene utilizzata per determinare in che modo verrà modificato il valore dell'agente. Nel nostro caso, useremo il simbolo di addizione + per aggiungere un valore al valore esistente dell'agente. "Valore" è il valore passato alla funzione che a sua volta verrà utilizzato per aggiornare di conseguenza il valore dell'agente.
Return Value- Prima restituisce l'agente così com'è, se è presente una funzione non bloccante. Alla fine, restituisce un oggetto agente con un nuovo valore.
Esempio
Un esempio di come viene utilizzato è mostrato nel seguente programma.
(ns clojure.examples.example
(:gen-class))
(defn Example []
(def counter (agent 0))
(println @counter)
(send-off counter + 100)
(println @counter)
(println @counter))
(Example)
Stiamo guardando lo stesso esempio di incremento del valore del contatore, ma dal seguente output sarà chiaro cosa fa la funzione di invio.
Produzione
Il programma precedente produce il seguente output.
0
0
0
Si può vedere che anche se abbiamo inviato all'agente una funzione per impostare il valore su 100, non si riflette immediatamente. La funzione di invio restituisce innanzitutto il valore dell'agente così com'è. Una volta che il valore dell'agente è stato impostato correttamente da Clojure, il valore dell'agente viene quindi aggiornato e siamo in grado di vedere il nuovo valore dell'agente.