When I invoke a macro:
(with-object someobject)
someobject is not evaluated, it is passed as a symbol to the macro. I need
somehow to get the meta for the object that is hidden behind that symbol.
So, I won't be passing objects in-line, as you did in your Foo example, I
will first be doing:
(defobject foo {map of my functions / values})
(with-object foo (some-expressions))

Throwing an exception when meta is not there is one thing what I want (the
missing part); the printing was just there to make the example shorter,
it's not actually the real code - I don't need a macro for that. In
reality, after all checks, there is code generated that desctructures the
map in a (let) and executes some-expressions in this context, making
certain bindings available for the expressions. This bit works fine, it's
just the meta check that doesn't work as I don't know how to get the object
that the symbol points to (in the macro, all I have is just a symbol):

user=> (def somename 17)
#'user/somename
user=> (defmacro testabc [name] (class name))
#'user/testabc
user=> (testabc somename)
clojure.lang.Symbol

When I change the macro like this:
user=> (defmacro testabc [name] name)

the object is returned:
user=> (testabc somename)
17

but it is because after macro expansion the returned symbol resolves to the
object I set before. I would like to be able to get access to that object
at macro call time.
But when I come to think about it now, I guess this would be impossible?
Are the vars available when the macro is called? i.e.:

user=> (def somename 17)
user=> (testabc somename) ; <- in this macro, I need to take the 'somename'
symbol and retrieve value 17 from above - is this possible at all?

Thanks for your help,
wujek


On Mon, Jan 14, 2013 at 4:25 PM, Jim foo.bar <jimpil1...@gmail.com> wrote:

>  I am not sure I follow...Do you by any chance want the macro-expansion
> to lead you directly to one of your two options (printing or exception)? In
> this case you can do this:
>
> (defmacro with-obj [ob]
>  (if-let [obj-meta (meta ob)] (eval ob) ;not replacing any code but
> eval-ing on the fly
>
>    (throw (IllegalArgumentException. (str ob " seems not be our
> object")))))
>
> (defrecord Foo [a b])
>
> user=> (macroexpand '(with-obj "Jim"))
> IllegalArgumentException Jim seems not be our object  user/with-obj
> (NO_SOURCE_FILE:3)
> user=> (macroexpand '(with-obj (with-meta (Foo. 'x 'y) {:t 1 :p 2})))
> #user.Foo{:a x, :b y}
>
> So now you get the exception or the actual object at macro-expansion
> time...Does that help at all?
>
> Jim
>
>
>
> On 14/01/13 14:56, Wujek Srujek wrote:
>
> Actually, the with-object mecro is very similar to
> clojure.algo.monads/with-monad - it also lets a few bindings, like m-bind
> or m-result, and executes user-defined expressions in the context of the
> monad specified by a name. They just don't perform such checks, you can
> call with-monad with any symbol, and you will get an NPE:
> user=> (require '[clojure.algo.monads :refer :all])
>  user=> (domonad identity-m [a 2 b 3] (* a b))
> 6
> user=> (domonad whatever [a 2 b 3] (* a b))
> NullPointerException   user/eval1803 (NO_SOURCE_FILE:1)
>
>  That's probably because the monad functions set up by with-monad are
> nils. (domonad uses with-monad under the hood.) If I perform my check, I
> will be able to give a much nicer error message, and there is a lot value
> in that.
>
>  wujek
>
>
> On Mon, Jan 14, 2013 at 3:45 PM, Wujek Srujek <wujek.sru...@gmail.com>wrote:
>
>> Because this is not the whole functionality ;d The check is just a
>> fragment, the one that doesn't work. There is much more to it, like taking
>> the object, taking some keys and values and using them in (let) and then
>> executing some code in this context (which is another parameter, which is
>> not in my example as I wanted to keep it simple).
>> If I could do it with a function, I would of course prefer it, but I am
>> not sure if it can work.
>>
>>  wujek
>>
>>
>>  On Mon, Jan 14, 2013 at 3:41 PM, Jim foo.bar <jimpil1...@gmail.com>wrote:
>>
>>> Why does this have to be a macro? Why can't it be a first-class function
>>> instead?
>>>
>>> (defn with-obj [ob]
>>>  (if-let [obj-meta (meta ob)]  name
>>>   (throw (IllegalArgumentException. (str ob " seems not be our
>>> object")))))
>>>
>>> Jim
>>>
>>>
>>>
>>> On 14/01/13 14:34, Jim foo.bar wrote:
>>>
>>>> Of course you should know that built-in java types do not support
>>>> meta-data...You need to  implement IObj in order to provide meta-data
>>>> support to your own types...otherwise use records...
>>>>
>>>> Jim
>>>>
>>>>
>>>> On 14/01/13 14:32, Jim foo.bar wrote:
>>>>
>>>>> On 14/01/13 14:27, wujek.sru...@gmail.com wrote:
>>>>>
>>>>>> (defmacro with-obj [name]
>>>>>>  (let [obj-meta (meta name)]
>>>>>>   (if (or (nil? obj-meta)) ; (not (::my-obj obj-meta)))
>>>>>>    (throw (IllegalArgumentException. (str name " seems not be our
>>>>>> object")))))
>>>>>>  `(println "nice"))
>>>>>>
>>>>>>
>>>>>
>>>>> Try this:
>>>>>
>>>>>
>>>>> (defmacro with-obj [name]
>>>>>  `(if-let [obj-meta# (meta ~name)]
>>>>>     (println "nice")
>>>>>   (throw (IllegalArgumentException. (str ~name " seems not be our
>>>>> object")))))
>>>>>
>>>>> HTH...
>>>>>
>>>>> 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 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 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 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

Reply via email to