Destructuring syntax

102 views
Skip to first unread message

Johnny Weng Luu

unread,
Jan 4, 2012, 1:36:06 AM1/4/12
to clo...@googlegroups.com
One thing that seems weird is the way Clojure destructures a map

I have this map: {:last-name "Vinge" :first-name "Vernor"} which is passed to this function: (defn greet-author-2 [{fname :first-name}] ... )

Wouldn't it be better doing: (defn greet-author-2 [{:first-name fname}] ... )

You first type the keyword, then followed by the parameter to bind to. It reads that the value is bound to the parameter in the same place.

Feels more natural to me in a way.

Thoughts?

Jay Fields

unread,
Jan 4, 2012, 9:05:22 AM1/4/12
to clo...@googlegroups.com
That does feel a bit more natural, but how would you handle :keys, :as, and :or?

> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clo...@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+u...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en

Ben Smith-Mannschott

unread,
Jan 4, 2012, 9:22:23 AM1/4/12
to clo...@googlegroups.com

Doesn't make sense that way around. Remember that in a map, the key is
unique, but the value need not be. Remember that in a Lisp this isn't
just a question of arbitrary syntax. The code you write is always also
a data structure.

With the current solution I can write this, which while not obviously
useful at least has an obvious meaning:

(let [{name1 :name name2 :name} {:name "a"}]
(= name1 name2))

Your proposal would seem to allow this:

(let [{:first-name name :last-name name} {:last-name "last"
:first-name "first"}]
(= name ???))

It's not clear what this would mean.

It would also make it impossible to bind the value for a given key to
more than one variable, since map keys must be unique:

(let [{:name name1 :name name2} {:name "a"}]
;; boom? )

// Ben

Alex Miller

unread,
Jan 4, 2012, 11:29:52 AM1/4/12
to Clojure
I had the same thought when I first started learning Clojure - I think
the idea is that there is some nice mental resonance when
destructuring matches up to your mental model of the data structure
(it's literal form). In sequential destructuring, that holds but in
maps it doesn't so things look "backwards". I think the way I've come
to understand it is that when doing a let-style binding, the thing
being bound is always "on the left" so when destructuring a map, you
specify the variable, then the key which is looked up to provide the
value.

Matthew Boston

unread,
Jan 4, 2012, 8:20:22 PM1/4/12
to Clojure
I'm with Alex. I think of it as though it's a let binding, cause
that's basically what's happening; the is bound to the scoped name.

Jeb Beich

unread,
Jan 5, 2012, 10:53:02 AM1/5/12
to clo...@googlegroups.com
"Joy of Clojure" adds a second reason for this:

"The second reason is because it allows us to conjure up other destructuring features by using forms that would otherwise make no sense. Because the item on the left of each pair will be a new local name, it must be a symbol or possibly a nested destructuring form. But one thing it can’t be is a keyword, unless the keyword is a specially supported feature such as :keys, :strs, :syms, :as, and :or."

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@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+u...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en



--
Jeb Beich
http://www.red-source.net/jeb
Reply all
Reply to author
Forward
0 new messages