Clojure Dynamic Binding

Zdaję sobie sprawę, że z wielu powodów to zły pomysł. Zdaję sobie również sprawę, że biorąc pod uwagę, że mam repozytorium stackoverflow 23, to natura zakłada, że ​​jestem uczącym się programem do programowania. Proszę jednak, pomów mi z humorem, i skup się na „jak to zrobić”, a nie „dlaczego chcesz to zrobić / nie chcesz tego robić”.

Czego chcę:

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

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

do wyjścia:

Dog: woof
Cat: meow

Więc zasadniczo chcęze zwierzęciem być makro s.t. wszystkie wystąpienia wywołania funkcji „mów” zostają odwzorowane na obiekt, do którego dzwonię blok.

W szczególności nie chcę pisać:

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

Raczej chcę, żeby zwierzę ze sobą zrobiłomówić mapa funkcji do jakiejś metody obiektu, z którym dzwonię.

Czy w Clojure można to zrobić w czysty sposób?

Dzięki!

questionAnswers(2)

yourAnswerToTheQuestion