以下は多くの理由で悪い考えだと思います。また、スタックオーバーフローの担当者が23人であることを考えると、私がプログラミングを学んでいる初心者であると想定するのが自然なことです。しかし、私をユーモアを交えて、「なぜこれをやりたいのか/やりたくないのか」という側面ではなく、「どうすればこれができるのか」に焦点を当ててください。
私が欲しいもの:
(def dog (Dog. ...))
(def cat (Cat. ...))
(with-animal dog
(println (str "Dog: " (speak) "\n")))
(with-animal cat
(println (str "Cat: " (speak) "\n")))
出力する:
Dog: woof
Cat: meow
したがって、基本的に、 with-animalをマクロにしたいのですが、「speak」関数呼び出しのすべての発生は、ブロックを呼び出しているオブジェクトにマップされます。
特に、私は書きたくありません:
(let-binding [speak (fn [] "woof")] ...)
(let-binding [speak (fn [] "meow")] ...)
むしろ、with-animalに、speak関数を呼び出しているオブジェクトのメソッドにマップさせたいと思います。
Clojureでこれを行うためのクリーンな方法はありますか?
ありがとう!