Hello,

I wanted to try it too, so I grabbed Timothy's version, and did some
improvements (I hope they are, feedback welcome ! :-) over it.

Something I corrected is the removal of null or blank items, as in the first
python version.
I also got rid of the assoc by using update-in.
And I felt that there was too much use of apply, but this may be subjective.

Question: In order to use update-in (or assoc in the previous version), one
has to transform the seqs returned by partition into a vector of vectors,
thus the use of 'into.
It still seems a little bit ugly to me. Is there a more concise (if not
idiomatic) way to do that ?

Here is the new version:

(ns html.table)

(defn make-table [column-count selected-row selected-column words]
  (let [remove-blank (partial remove #(or (nil? %) (-> % .trim .isEmpty)))
        table (into [] (map (partial into []) (partition column-count
(remove-blank words))))
        table-with-selected (update-in table [selected-row selected-column]
(partial list :bold))]
    (cons :table
          (map (fn [r] (cons :tr (map (fn [i] (list :item i)) r)))
               table-with-selected))))

(defn test-mt []
    (make-table 3 1 0 ["cat" "dog" "rabbit" "cat" "dog" "rabbit" "frog"
"elephant" "gorilla"]))

Regards,

-- 
Laurent



2009/2/17 Timothy Pratley <timothyprat...@gmail.com>

>
> I found this question interesting for two reasons:
>
> (1) A selected item has been specified which needs to be handled
> differently - at first glance suggests an iterative solution.
> (2) There is good support for html in clojure via libraries, so you
> should avoid string concatenation of tags.
>
> So here is my solution:
> http://groups.google.com/group/clojure/web/layout.clj
>
> Notably it bolds the selected item without any iteration, and returns
> a list representation of the html instead of a string. I'm not
> familiar with the html libraries to render this representation so
> forgive any inconsistencies there, but the output is:
>
> (:table (:tr (:item (:bold "cat")) (:item "dog") (:item "")) (:tr
> (:item "rabbit") (:item "frog") (:item "elephant")))
> Which will be validated by the rendering library, giving an additional
> security that it is correct.
>
> In order to deal with the 'selected item' I had to jump through some
> hoops to treat collections as vectors and use assoc on that. Is there
> perhaps a more elegant way? Overall though I hope it is a good example
> of how and why it is a good idea to avoid string catting and instead
> think of the problem in terms of creating a structure.
>
> Really you are building a tree based upon some inputs. I'd be
> interested in other ways the tree could be constructed.
>
>
> Regards,
> Tim.
>
>
> >
>

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