On Mon, Sep 22, 2014 at 2:45 PM, J David Eisenberg
<jdavid.eisenb...@gmail.com> wrote:
> As part of a larger program, I'm testing a function that will turn a string
> of days on which a class occurs (such as "MWF") into a list of seven
> numbers: (1 0 1 0 1 0 0).
> I first translate"TH" (Thursday) to "R" and "SU" (Sunday) to "N" to make
> things a bit easier.
>
> I came up with the following code:
>
> (defn days-number-maker
>   "Recursively compare first item in days of week with
> first item in string of days. If matching, add a 1,
> else add a zero to the result"
>   [all-days day-string result]
>   (if (empty? all-days) (reverse result)
>     (if (= (first all-days) (first day-string))
>       (recur (rest all-days)(rest day-string) (conj result 1))
>       (recur (rest all-days) day-string (conj result 0)))))
>
> (defn days-to-numbers
>   "Change string like MTTH to (1 1 0 1 0 0 0)"
>   [day-string]
>   (let [days (clojure.string/replace
>                (clojure.string/replace day-string #"TH" "R") #"SU" "N")]
>     (days-number-maker "MTWRFSN" days (list))))
>
> The good news: the code works. The bad news: I'm convinced I'm doing it
> wrong, in the moral purity sense of the word. Something inside of me says,
> "You could have just used (map...) to do this the *right* way," but I can't
> see how to do it with (map). So, my two questions are:
>
> 1) Is there such a thing as "the Clojure way," and if so,
> 2) How can I rewrite the code to be more Clojure-ish?

Just for fun, I thought of a way to do this with map. The trick is to
not map over the days of the class, but instead map over the days of
the week, checking for matches in the class schedule.

(def week ["SU" "M" "T" "W" "TH" "F" "S" "SU"])

(def class-schedule "MWTHFSU")

(defn class-days [class-schedule]
  (->> class-schedule
       (re-seq #"(TH|SU|S|M|T|W|F)")
       (map first)
       set))

user=> (mapv (partial contains? (class-days class-schedule)) week)
[true true false true true true false true]

Anyway, it's such a trivial problem that I don't think anyone would
fault you one way or another (unless you were out there using an atom
or something to track state) but this is one way to do it with map.

--

In Christ,

Timmy V.

http://blog.twonegatives.com/
http://five.sentenc.es/ -- Spend less time on mail

-- 
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/d/optout.

Reply via email to