[Cs254f11] Simple mapping problem
Lee Spector
lspector at hampshire.edu
Thu Nov 17 13:24:45 EST 2011
Very nice!
And that makes me think that this would be nice in another way:
(map (fn [[pitch duration]] (+ 5 pitch)) m)
This applies Tom's strategy but uses destructuring binding (note the double brackets) to name and then refer to the parts of the 2-element vector that the function will receive as an argument. Tom's is shorter but this is a little more self-documenting.
-Lee
On Nov 17, 2011, at 1:12 PM, Thomas Helmuth wrote:
> Also, you could do it with only one map:
>
> (map #(+ 5 (first %)) m)
>
> This just maps a function down m that adds 5 to the first thing in the inner vector.
>
> -Tom
>
> On Thu, Nov 17, 2011 at 1:05 PM, Lee Spector <lspector at hampshire.edu> wrote:
>
> Jesse,
>
> You've got several near misses there, and there are several ways to do what you want. My first impulse is:
>
> (map #(+ % 5)
> (map first m))
>
> => (90 97 71 85 55 90 71 42 108 39 118)
>
> Reading from the inside out, it maps first down m to produce a list of all the pitches (the first elements of the notes in your melody). Then it maps a function down that list of pitches. That function is specified anonymously, using the #() syntax, and it is the function that returns the result of calling + on its argument (%) and 5.
>
> In place of #(+ % 5) you could write, if you like, (fn [x] (+ x 5)).
>
> Of course, you could use a variable there in place of the 5.
>
> If you don't like the nesting you could do something like:
>
> (let [pitches (map first m)]
> (map #(+ % 5) pitches))
>
> And there are many other options. Here's a particularly weird one just for the heck of it:
>
> (->> (map first m)
> (map #(+ % 5)))
>
> -Lee
>
>
>
> On Nov 17, 2011, at 12:05 PM, Jesse French wrote:
>
> > Hi all,
> >
> > I'm trying to figure out how to map some simple functions along a vector, and having trouble due to my lack of understanding of how map works.
> >
> > (def m
> > [[85 1]
> > [92 5/16]
> > [66 15/16]
> > [80 1/8]
> > [50 1/8]
> > [85 1/4]
> > [66 13/16]
> > [37 1/16]
> > [103 1/8]
> > [34 1/8]
> > [113 7/16]]
> >
> > My goal is to map a '+ x' down the first value of this vector.
> >
> > Even
> > (map first (map inc m))
> > doesn't work, when I would like to be doing something like
> > (map first (map (+ m x))
> > or
> > (map (+ (map first m) x))
> >
> >
> > (def p [100 15 29 7 63 59 44 72])
> > (map inc p)
> > This works, so I'm assuming my problem is with the syntax of how I'm nesting them.
> >
> >
> > Any thoughts?
> >
> > Jesse
> >
> > _______________________________________________
> > Cs254f11 mailing list
> > Cs254f11 at lists.hampshire.edu
> > https://lists.hampshire.edu/mailman/listinfo/cs254f11
>
> --
> Lee Spector, Professor of Computer Science
> Cognitive Science, Hampshire College
> 893 West Street, Amherst, MA 01002-3359
> lspector at hampshire.edu, http://hampshire.edu/lspector/
> Phone: 413-559-5352, Fax: 413-559-5438
>
> _______________________________________________
> Cs254f11 mailing list
> Cs254f11 at lists.hampshire.edu
> https://lists.hampshire.edu/mailman/listinfo/cs254f11
>
--
Lee Spector, Professor of Computer Science
Cognitive Science, Hampshire College
893 West Street, Amherst, MA 01002-3359
lspector at hampshire.edu, http://hampshire.edu/lspector/
Phone: 413-559-5352, Fax: 413-559-5438
More information about the Cs254f11
mailing list