2009/7/14 Stephen C. Gilardi <[email protected]>:
>
> On Jul 13, 2009, at 10:26 PM, [email protected] wrote:
>
>> user=> (try (Integer/parseInt "x") (catch Exception _ 0))
>> 0
>> user=> (defmacro parse-int [a default] `(try (Integer/parseInt ~a)
>> (catch Except
>> ion _ ~default)))
>> #'user/parse-int
>> user=> (parse-int "x" 0)
>> java.lang.Exception: Can't bind qualified name:user/_ (NO_SOURCE_FILE:
>> 0)
>
> You've introduced the name _ to hold the ignored exception. Non-local names
> are "resolved" to symbols that include a namespace part: they're interpreted
> as references to vars rather than as locals.
>
> To introduce a local name, you need to use gensym to generate a unique
> symbol to name the local. Alternatively, you cause the "# suffix" syntax to
> request an "auto-gensym".
>
> This works:
>
> user=> (defmacro parse-int [a default]
> `(try (Integer/parseInt ~a)
> (catch Exception _# ~default)))
> #'user/parse-int
> user=> (parse-int "123" 4)
> 123
> user=> (parse-int "x" 4)
> 4
> user=> (macroexpand '(parse-int "123" 4))
> (try (Integer/parseInt "123")
> (catch java.lang.Exception ___108__auto__ 4))
> user=>
But, of course, there's no need for a macro here:
user=> (defn parse-int [a default]
(try (Integer/parseInt a)
(catch Exception _ default)))
#'user/parse-int
user=> (parse-int "x" 0)
0
--
Michael Wood <[email protected]>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---