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!