parse-or-nil can be avoided by calling parse with an additional
argument (ParsePosition. 0), in which case parse returns nil on
failure.

On Jul 30, 6:21 am, Laurent PETIT <laurent.pe...@gmail.com> wrote:
> Hi,
>
> 2010/7/30 abhinav sarkar <abhinav.sar...@gmail.com>
>
>
>
>
>
> > Hi,
> > I am just starting to learn Clojure by writing a small library. I came
> > across a situation in which I have to parse a String for getting a Date. Now
> > the string can be in one of the three formats. So I wrote this functions to
> > parse it:
>
> > (def #^{:private true :tag SimpleDateFormat} full-date-format
> >   (doto (SimpleDateFormat. "EEE, dd MMMM yyyy HH:mm:ss +0000")
> >     (.setTimeZone (TimeZone/getTimeZone "GMT"))))
>
> > (def #^{:private true :tag SimpleDateFormat} date-format-wo-tz
> >    (doto (SimpleDateFormat. "EEE, dd MMMM yyyy HH:mm:ss")
> >     (.setTimeZone (TimeZone/getTimeZone "GMT"))))
>
> > (def #^{:private true :tag SimpleDateFormat} short-date-format-wo-tz
> >   (doto (SimpleDateFormat. "dd MMM yyyy, HH:mm")
> >     (.setTimeZone (TimeZone/getTimeZone "GMT"))))
>
> > (defn- parse-date [date-str]
> >   (if (some #(% date-str) [nil? blank?])
> >     nil
> >     (let [clean-date-str (trim date-str)]
> >       (try
> >         (.parse full-date-format clean-date-str)
> >         (catch java.text.ParseException e
> >           (try
> >             (.parse date-format-wo-tz clean-date-str)
> >             (catch java.text.ParseException e
> >               (.parse short-date-format-wo-tz clean-date-str))))))))
>
> Just create an intermediate function which returns nil instead of throwing
> an exception, and use some. Something like this (not tested):
>
> (def #{:private true} parsers [full-date-format, date-format-wo-tz,
> short-date-format-wo-tz])
>
> (defn- parse-date [date-str]
>   (if (some #(% date-str) [nil? blank?])
>     nil
>     (let [clean-date-str (trim date-str)
>            parse-or-nil (fn [parser date-str] (try (.parse parser date-str)
> (catch java.text.ParseException e nil)))]
>       (some #(parse-or-nil % clean-date-str) parsers))))
>
> HTH,
>
> --
> Laurent
>
>
>
>
>
> > I can't help but think that there must be a better way to do the same
> > without so many nested try catch blocks. If this were Java, I could have
> > looped over all the date formats and used an explicit return in the try
> > block and continue in catch block. I don't understand how to do explicit
> > return in Clojure.
>
> > Also as the number of formats grows, I'll have to add more nested try catch
> > blocks. Please suggest a cleaner way to do this.
>
> > Regards,
> > Abhinav
>
> > --
> > 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<clojure%2bunsubscr...@googlegroups.com­>
> > For more options, visit this group at
> >http://groups.google.com/group/clojure?hl=en- Hide quoted text -
>
> - Show quoted text -- Hide quoted text -
>
> - Show quoted text -

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