this is what i'd use

(def component? number?)

*(defmacro defcomponent [name co]
  `(let [c# ~co]
     (assert (component? c#)
       (str "Not a valid IComponent passed:\nevaluated form: `"
         (pr-str c#) "`\noriginal form: `"
         '~co "`\nfull form: `" '~&form "`"
         "\nlocation: " ~(meta &form) " file: " ~*file*
         ))
     (def ~name c#)
     )
  )*
=> *assert*
true
=> (defcomponent a (do "a" (str "b")))
AssertionError Assert failed: Not a valid IComponent passed:
evaluated form: `"b"`
original form: `(do "a" (str "b"))`
full form: `(defcomponent a (do "a" (str "b")))`
location: {:column 1, :line 96} file: util\funxions.clj
(util.funxions/component? c__33004__auto__)  util.funxions/eval33010
(funxions.clj:96)


(defcomponent a (do "a" (str "b")))
=>* (defcomponent a (+ 1 2))*
#'runtime.q/a
=> a
3




On Thu, Feb 21, 2013 at 3:51 PM, AtKaaZ <atk...@gmail.com> 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> 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>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>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
>>>> 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.
>>>>
>>>>
>>>>
>>>
>>>
>>> --
>>> 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.
>>>
>>>
>>>
>>
>>
>>
>> --
>> 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.
>>
>>
>>
>
>
>
> --
> Please correct me if I'm wrong or incomplete,
> even if you think I'll subconsciously hate it.
>
>


-- 
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.


Reply via email to