I'm trying to implement a (very) simple actor model prototype in clojure. Each actor would have, as the loop to handle the arrival of messages, a `go-loop`. I wanted to invoke, inside this `go-loop`, functions that would either take from or put into a channel. I really wanted parking behaviour on these inner channel operations, but I can't actually use `<!` or `>!` to do it so, because the operations wouldn't be directly inside the `go-loop`. Can I use macros to circumvent such limitation? If so, how would I do it?

To illustrate the issue simply, in the following snippet, how can I change `foo` so that the code actually compiles and I get parking behaviour? 

```
(defn main-loop
  [ch]
  (async/go-loop [] (foo ch) (recur)))
(defn foo [ch] (>! ch "Hello, World!"))

```