Clojure Dynamic Binding

Mir ist klar, dass das Folgende aus vielen Gründen eine schlechte Idee ist. Mir ist auch klar, dass ich bei einem Stackoverflow von 23 davon ausgehen kann, dass ich als Neuling das Programmieren lerne. Wenden Sie sich jedoch bitte an mich und konzentrieren Sie sich auf den Aspekt "Wie können wir das tun?" Anstatt auf den Aspekt "Warum möchten Sie dies tun? / Sie möchten dies nicht tun?".

Was ich möchte:

(def dog (Dog. ...))
(def cat (Cat. ...))

(with-animal dog
  (println (str "Dog: " (speak) "\n")))
(with-animal cat
  (println (str "Cat: " (speak) "\n")))

ausgeben:

Dog: woof
Cat: meow

Also im Grunde will ichmit-tier ein Makro sein Alle Vorkommen des Funktionsaufrufs "speak" werden dem Objekt zugeordnet, mit dem ich den Block aufrufe.

Insbesondere möchte ich nicht schreiben:

(let-binding [speak (fn [] "woof")] ...)
(let-binding [speak (fn [] "meow")] ...)

Vielmehr möchte ich, dass das Mit-Tier das machtsprechen Funktionszuordnung zu einer Methode des Objekts, mit dem ich aufrufe.

Gibt es eine saubere Möglichkeit, dies in Clojure zu tun?

Vielen Dank!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage