I apologise...this works almost perfectly:

(defmacro defcomponent [name co]
`(let [c# ~co]
  (assert (component? c#) "Not a valid IComponent")
  (def ~name c#)))

the only slight problem is the error thrown which has the gensym symbol in the flailing condition...Well, I can't have everything can I? :)

Jim

On 21/02/13 14:51, AtKaaZ wrote:
I think the assert is working but either something eats up the thrown exception silently which would explain why def isn't reached, OR the defcomponent is never called, OR it is called with a different name param as you'd have expected. Try putting something before the assert to log if that point was ever reached.


On Thu, Feb 21, 2013 at 3:29 PM, Jim foo.bar <jimpil1...@gmail.com <mailto:jimpil1...@gmail.com>> wrote:

    oops major typo! the correct is:


    (defmacro defcomponent [name co]
    `(let [c# ~co]
      (assert (component? c#) "Not a valid IComponent")
      (def ~name c#)))

    However, this doesn't work! Something weird with the
    assertion...If I comment it out it works as expected, otherwise
    the var is unbound at the end! strange stuff....I may end up using
    'eval' as I used to...

    Jim



    On 21/02/13 14:20, Jim foo.bar wrote:
    I settled for:

    (defmacro defcomponent [name co]
    `(let [c# ~co]
      (assert (component? c# "Not a valid IComponent"))
      (def ~name c#)))

    Jim

    On 21/02/13 14:18, AtKaaZ wrote:
    that one doesn't actually work, maybe, not sure why exactly but
    the assert is ignored

    => (def component? number?)
    #'runtime.q/component?

    => (defmacro defcomponent [name co]
        `(assert (component? ~co) "Not a valid IComponent")
        `(def ~name ~co))
    #'runtime.q/defcomponent

    => (defcomponent a "a")
    #'runtime.q/a


    The `(do ...) one works though,
    => (defmacro a []
         `(println 1)
         `(println 2)
         )
    #'runtime.q/a
    => (a)
    2
    nil

    => (defmacro a []
         `(do
            (println 1)
            (println 2)
            )
         )
    #'runtime.q/a
    => (a)
    1
    2
    nil




    On Thu, Feb 21, 2013 at 3:14 PM, Jim foo.bar
    <jimpil1...@gmail.com <mailto:jimpil1...@gmail.com>> wrote:

        I tried this and it works, but I need 2 backticks and I'm
        essentially generating the assert-form when the macro is
        called...I'd like to generate only the def-form at run-time...

        (defmacro defcomponent [name co]
          `(assert (component? ~co) "Not a valid IComponent")
          `(def ~name ~co))

        it looks ugly doesn't it?

        Jim




        On 21/02/13 14:11, AtKaaZ wrote:
        or you could place the assert inside the backquote


        On Thu, Feb 21, 2013 at 3:10 PM, Jim foo.bar
        <jimpil1...@gmail.com <mailto:jimpil1...@gmail.com>> wrote:

            On 21/02/13 14:07, Jim foo.bar wrote:

                Hi all,

                I''d like to have a macro like the following but
                preferably without the 'eval' inside the assertion
                form:

                (defmacro defcomponent [name co]
                 (assert (component? (eval co)) "Not a valid
                IComponent")
                 `(def ~name ~co))

                If I don't use eval, everything works as long as I
                pass a var in...However if I pass in something like
                (String. "jam") it is not being evaluated and thus
                is a list not an object...and it will never satisfy
                IComponent.

                any thoughts?
                thanks in advance :)

                Jim



            I could have phrased this better...One of my arguments
            has to NOT be evaluated (name) but the other needs to
            be evaluated (co) so I can assert whatever I want to
            assert on it...I cannot use 'defn' (it will cause
            'name' to be evaluated) so my only option is a macro
            that forces eval on the second arg, yes?


            Jim

-- -- You received this message because you are subscribed to
            the Google
            Groups "Clojure" group.
            To post to this group, send email to
            clojure@googlegroups.com <mailto:clojure@googlegroups.com>
            Note that posts from new members are moderated - please
            be patient with your first post.
            To unsubscribe from this group, send email to
            clojure+unsubscr...@googlegroups.com
            <mailto:clojure%2bunsubscr...@googlegroups.com>
            For more options, visit this group at
            http://groups.google.com/group/clojure?hl=en
            --- You received this message because you are
            subscribed to the Google Groups "Clojure" group.
            To unsubscribe from this group and stop receiving
            emails from it, send an email to
            clojure+unsubscr...@googlegroups.com
            <mailto:clojure%2bunsubscr...@googlegroups.com>.
            For more options, visit
            https://groups.google.com/groups/opt_out.





-- Please correct me if I'm wrong or incomplete,
        even if you think I'll subconsciously hate it.

-- -- You received this message because you are subscribed to the
        Google
        Groups "Clojure" group.
        To post to this group, send email to
        clojure@googlegroups.com <mailto:clojure@googlegroups.com>
        Note that posts from new members are moderated - please be
        patient with your first post.
        To unsubscribe from this group, send email to
        clojure+unsubscr...@googlegroups.com
        <mailto:clojure+unsubscr...@googlegroups.com>
        For more options, visit this group at
        http://groups.google.com/group/clojure?hl=en
        ---
        You received this message because you are subscribed to the
        Google Groups "Clojure" group.
        To unsubscribe from this group and stop receiving emails
        from it, send an email to
        clojure+unsubscr...@googlegroups.com
        <mailto:clojure+unsubscr...@googlegroups.com>.
        For more options, visit
        https://groups.google.com/groups/opt_out.



-- -- You received this message because you are subscribed to the
        Google
        Groups "Clojure" group.
        To post to this group, send email to
        clojure@googlegroups.com <mailto:clojure@googlegroups.com>
        Note that posts from new members are moderated - please be
        patient with your first post.
        To unsubscribe from this group, send email to
        clojure+unsubscr...@googlegroups.com
        <mailto:clojure%2bunsubscr...@googlegroups.com>
        For more options, visit this group at
        http://groups.google.com/group/clojure?hl=en
        ---
        You received this message because you are subscribed to the
        Google Groups "Clojure" group.
        To unsubscribe from this group and stop receiving emails
        from it, send an email to
        clojure+unsubscr...@googlegroups.com
        <mailto:clojure%2bunsubscr...@googlegroups.com>.
        For more options, visit
        https://groups.google.com/groups/opt_out.





-- Please correct me if I'm wrong or incomplete,
    even if you think I'll subconsciously hate it.

-- -- You received this message because you are subscribed to the Google
    Groups "Clojure" group.
    To post to this group, send email to clojure@googlegroups.com
    <mailto:clojure@googlegroups.com>
    Note that posts from new members are moderated - please be
    patient with your first post.
    To unsubscribe from this group, send email to
    clojure+unsubscr...@googlegroups.com
    <mailto:clojure+unsubscr...@googlegroups.com>
    For more options, visit this group at
    http://groups.google.com/group/clojure?hl=en
    ---
    You received this message because you are subscribed to the
    Google Groups "Clojure" group.
    To unsubscribe from this group and stop receiving emails from
    it, send an email to clojure+unsubscr...@googlegroups.com
    <mailto:clojure+unsubscr...@googlegroups.com>.
    For more options, visit https://groups.google.com/groups/opt_out.




-- -- You received this message because you are subscribed to the Google
    Groups "Clojure" group.
    To post to this group, send email to clojure@googlegroups.com
    <mailto:clojure@googlegroups.com>
    Note that posts from new members are moderated - please be patient
    with your first post.
    To unsubscribe from this group, send email to
    clojure+unsubscr...@googlegroups.com
    <mailto:clojure%2bunsubscr...@googlegroups.com>
    For more options, visit this group at
    http://groups.google.com/group/clojure?hl=en
    ---
    You received this message because you are subscribed to the Google
    Groups "Clojure" group.
    To unsubscribe from this group and stop receiving emails from it,
    send an email to clojure+unsubscr...@googlegroups.com
    <mailto:clojure%2bunsubscr...@googlegroups.com>.
    For more options, visit https://groups.google.com/groups/opt_out.





--
Please correct me if I'm wrong or incomplete,
even if you think I'll subconsciously hate it.

--
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.



--
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to