On Sat, 28 Aug 2010 18:11:41 -0400
John Newman <john...@gmail.com> wrote:

> > #[[[[%3 %2 %1][%4 %5 %6]]] signal] -> [c b a d e f]
> 
> Right, the names are superfluous.  So are the extra set of brackets I
> guess.  Perhaps even better would be:
> 
> (#[[_ _ _][_ _ _]] signal)
> 
> Or if you wanted just the third item of the second collection:
> 
> (#[[][2]] signal)
> Also, I took the signal out of the #[...] form and passed it in as an
> argument instead.

This looks like a generally useful destructuring tweak, but it's
really only useful in the context of #[...], as it elides the
names - which you have to have to use it in current destructurings.

In this case, #[ would be reader macro that swallows the vector it
opens, and returns a function that destructures it's one argument and
returns a vector of the places indicated by the integers in the vector
expression.

I dunno why, but this feels more useful. In more detail:

#[...]: Should evaluate a vector holding either vectors or integers,
        and those vectors hold either vectors or integers, etc. and
        return a function with a binding that destructures it's
        argument (only one allowed). Vectors would work as they do
        now; integers would work to select elements in the sequence
        that destructuring matches to the enclosing vector. Note that
        the :as an & constructs aren't supported here - they don't
        make much sense.

The integers denote which positions you wanted to take in the
subvector, so #[[0 2] 1] would turn into something like:

   (fn [[a _ b] c] [a b c])

Of course, we want to let the integer values be calculated at run
time, so that #[[0 2] 1] is equivalent to (let [a 0 b 2 c 1] #[[a b] c])

Duplicates numbers don't cause a problem - they just generate
duplicates in the output. So (#[[0 2] 0] [[a b c d]]) should give
[a c [a b c d]].  That can be done as (fn [[a _ b :as c]] [a b c]).

> No, it is not as flexible as let, but it eliminates having to
> duplicate a b c d e h, etc.

Yup. Or in the new form, and more like #(, even having to worry about
the names.

> I am going to see if I can write a function that does:
> 
> => (destructure [[][2]] signal)
> (5 6 7 8)
> Or would it have to be a macro?

I dunno. Feels like it ought to be a function to me (both arguments
are evaluated on invocation), but you're going to build an fn
invocation and evaluate it, which sort of says macro. Sounds like
fun either way.

           <mike
-- 
Mike Meyer <m...@mired.org>             http://www.mired.org/consulting.html
Independent Network/Unix/Perforce consultant, email for more information.

O< ascii ribbon campaign - stop html mail - www.asciiribbon.org

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

Reply via email to