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+unsubscribe@**googlegroups.com<clojure%2bunsubscr...@googlegroups.com> >> For more options, visit this group at >> http://groups.google.com/**group/clojure?hl=en<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