2008-02-27
| 10:24 | Chouser | I accidentally left out the ":else" or "true" before my final case in (cond ...) and it worked correctly anyway. |
| 10:26 | rhickey | I need to add a check for even args, but I don't think it works generally: |
| 10:26 | rhickey | clojure=> (cond nil 1 2) |
| 10:26 | rhickey | nil |
| 10:26 | rhickey | clojure=> (cond nil 1 :else 2) |
| 10:26 | rhickey | 2 |
| 10:29 | Chouser | right, I was about to type that and got distracted. |
| 10:30 | Chouser | It's that final odd expression is of course treated as a test, so the return value of cond may not be what you want. |
| 10:53 | Chouser | zip/next and zip/end can't be used to walk a sub-tree, can they? |
| 10:55 | rhickey | no - you can create a zipper on the sub-tree though |
| 10:56 | Chouser | but then I can't navigate from some walked-to node to anywhere outside the sub-tree. |
| 10:56 | Chouser | s'okay -- I'll make this work, and then see if what I'm doing is just too weird. ;-) |
| 14:13 | Chouser | How can I tell if an object is a zip loc vs. some other kind of seq? |
| 14:15 | Chouser | Hm, check its meta-data for branch? |
| 14:41 | Chouser | Is it evil to use ((meta rtn) :zip/branch?) to distinguish between a loc and some other seq? |
| 14:43 | rhickey | yes |
| 14:44 | rhickey | but you can _add_ your own meta to the location object returned by zipper... |
| 14:45 | rhickey | and it should propagate to all other locations you get to from there |
| 14:47 | Chouser | hm. |
| 14:48 | Chouser | so you don't think the checking of metadata is evil, but me checking for your metadata is. |
| 14:51 | rhickey | right, because I might change it |
| 14:52 | rhickey | note that those keywords are namespace-qualified |
| 14:53 | rhickey | Perhaps I could provide a zipper? predicate, in which I check my own metadata |
| 14:53 | Chouser | ok, makes sense to me. |
| 14:56 | Chouser | I've never used a metadata system in a functional language like this. I have a long way to go before I'm comfortable with how it should be used. |
| 14:58 | rhickey | I don't think anyone has - I haven't, but I've needed metadata often enough that I put it in Clojure on spec |
| 15:22 | Chouser | to add {:foo bar} to html's meta: (meta (with-meta html (assoc (meta html) :foo :bar))) |
| 15:24 | rhickey | I don't get the outer meta - (with-meta html (assoc ^html :foo :bar)) should do it |
| 15:25 | rhickey | also, if you are adding metadata to someone else's stuff, best to use qualified keywords |
| 15:25 | rhickey | :my/foo |
| 15:34 | Chouser | oh, sorry, the outer was so I could see it afterwards. |
| 15:34 | rhickey | ah |
| 16:32 | Chouser | Well, I'm liking this quite a bit. I tweaked the mapcat pipeline thing I had working before so that now it operates on xml zippers instead of straing xml maps. |
| 16:33 | rhickey | was it easier? |
| 16:33 | Chouser | no, but now I can navigate as well. |
| 16:33 | Chouser | before I was losing my node context, so after filtering I only had the nodes that matched. |
| 16:34 | Chouser | Now I can find a node, and then say "right". |
| 16:34 | rhickey | also path |
| 16:35 | Chouser | I don't have a succint example, but the feel of it for me is definitely on par with xpath. |
| 16:35 | Chouser | And occsionally better, because I can drop in a #(... % ...) and do whatever I want. |
| 16:36 | Chouser | So the API is pretty close to what I want. The internals are pretty ugly 'cuz I don't really know what I'm doing. :-) |
| 16:36 | Chouser | (xml-> html flatten :tr #(= (attr % :class) "sBlackText")) |
| 16:37 | Chouser | That gives me a lazy seq of all <tr class="sBlackText"> nodes. |
| 16:37 | rhickey | as locations? |
| 16:37 | Chouser | right. |
| 16:37 | rhickey | cool |
| 16:38 | Chouser | so then if I use map to put each of those in tr, I can say: |
| 16:38 | Chouser | (xml-> tr right flatten :tr [:td :font :b] flatten node string?) |
| 16:39 | Chouser | that steps to then next <tr>, finds all descendant <tr>'s that have a <td><font><b></b></font></td> structure, and the extracts all the contained strings from that <tr> as a list. |
| 16:40 | Chouser | something like value(./following-sibling::tr//tr[td/font/b]) in xpath |
| 16:41 | Chouser | anyway, it's working pretty well for me. So thanks for doing most of the work, rhickey! |
| 16:41 | Chouser | Gotta go... |
| 17:18 | NarayanS | (filter (fn [[k v]](= (node-attrs k) v)) attr-values) |
| 17:18 | NarayanS | I am tryng to write it simpler |
| 17:18 | NarayanS | (filter #(= (node-attrs %1) %2) attr-values) |
| 17:18 | NarayanS | this doenst work - destructure bind |
| 17:18 | NarayanS | (filter #(= (node-attrs (key %1)) (val %1)) attr-values) |
| 17:18 | NarayanS | this works |
| 17:18 | NarayanS | am i doing something wrong? |
| 17:31 | hoeck_ | is attr-values a list, vector or a hashmap? |
| 17:32 | NarayanS | (def attr-values {:cnty "66"}) |
| 17:33 | NarayanS | (def node-attrs {:CovFlg "N", :cnty "66"}) |
| 17:35 | hoeck_ | (filter #(= (node-attrs %1) %2) attr-values) |
| 17:36 | hoeck_ | mhh |
| 17:37 | NarayanS | I get error when i do this filter code |
| 17:37 | NarayanS | java.lang.IllegalArgumentException: Wrong number of args passed |
| 17:37 | hoeck_ | which code? |
| 17:38 | NarayanS | (filter #(= (node-attrs %1) %2) attr-values) |
| 17:38 | hoeck_ | yes, you have to use destructuring |
| 17:39 | hoeck_ | so #(.. wont work |
| 17:39 | NarayanS | (filter (fn [[k v]](= (node-attrs k) v)) attr-values) this works |
| 17:40 | hoeck_ | and you want a shorte way to do that? |
| 17:40 | NarayanS | (filter #(= (node-attrs (key %)) (val %)) attr-values) this works. i was just wondering if we have a destructuring in the #( |
| 17:40 | hoeck_ | no, #( is without destructuring |
| 17:41 | NarayanS | thanks for answering |
| 17:45 | hoeck_ | you're welcome |
| 23:57 | jonathan_ | I just posted up a little SparkLine generator in Clojure. It's at http://jonathanwatmough.com/?p=220 |