Here's another, perhaps very controversial, solution:
(in m.2.2.1)
;; in
(defn flexible-get
([map key]
(or (let [k (read-string key)]
(and (number? k)
(get map k)))
(get map (keyword key))
(get map (name key))))
([map key & more]
(apply flexible-get (flexible-get map key) more)))
(defn lookup-symbol? [x]
(and (symbol? x)
(.contains (name x) ".")
(not (.endsWith (name x) "."))
(not (.startsWith (name x) "."))))
(defmacro in
"allows dot map key access. ex: (in (let [a {:b 1 \"c\" 2}] (+ a.b
a.c))) => 3 "
[& forms]
`(do ~@(postwalk (fn [x]
(if (lookup-symbol? x)
(let [[map & keys] (.split (str x) "\\.")]
`(flexible-get ~(read-string map) ~@keys))
x))
forms)))
Scott
On Wed, Jun 29, 2011 at 9:41 PM, Scott Jaderholm <[email protected]> wrote:
> (defmacro ->f
> "like -> but f is threaded at pos 0 instead of 1"
> ([f] f)
> ([f x] `(~f ~x))
> ([f x & more]
> `(->f (~f ~x) ~@more)))
>
>
> (->f m 2 2 1)
>
> Scott
>
>
>
> On Wed, Jun 29, 2011 at 7:00 PM, Antonio Recio <[email protected]> wrote:
>> Is there other way to express (((m2) 2) 1)?
>> (def m [1 2 [21 22 [221 222 223] 23] 3])
>> (((m 2) 2) 1)
>> ;-> 222
>>
>> --
>> 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
>
--
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