On Jun 2, 2009, at 3:35 AM, Adrian Cuthbertson wrote:
Thanks Steve! That's very neat. Pretty much a "canonical" macro example.

You're welcome! I'm glad you like it.

On Jun 2, 2009, at 4:45 AM, Konrad Hinsen wrote:
That looks like a perfect candidate for clojure.contrib.repl-utils!

Thanks! After a little more discussion, I'd like to put it in there.

After thinking about other macro advice I've seen (from Meikel Brandmeyer and elsewhere), I came up with this version that does most of the work in a function and provides the macro just to control the evaluation of arguments:

  (defn run*
    "Loads the specified namespace and invokes its \"main\"
    function with optional args."
    [ns-sym & args]
    (require ns-sym :reload-all)
    (apply (ns-resolve ns-sym 'main) args))

  (defmacro run
    "Loads the specified namespace and invokes its \"main\"
    function with optional args. ns-name is not evaluated."
    [ns-name & args]
    `(run* '~ns-name ~...@args))

I see the tradeoffs as:

possible negative:

        - an extra name in the namespace

positives:

        - the code is easier to understand
- the function version composes better: it's easier to call from other code if that were desired.

Overall I like the function/macro pair version better.

Any thoughts?

--Steve

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to