Tuesday, 24 January 2012

A Map Function

A map contains pairs, where the first element is the key and the second element is the attached value: you can set one up with curly brackets, for example:

user=> (def partner {:laurel :hardy, :hardy :laurel, :chaplin nil})

Now you can look up, say, Laurel's partner:

user=> (get partner :laurel)

In our map, Chaplin does not have a partner, so you get this:

user=> (get partner :chaplin)

Of course - we made the value nil when we created the map.  However, if we look up someone who is not in the map, we also get nil:

user=> (get partner :abbott)

The problem (A nil key) today is to write the code that will check for the case where the key really is in the map but the value is nil - - as opposed to the case where the key is not in the map.

We need the function contains?, which asks whether a key is in a map:

user=> (contains? partner :abbott)
user=> (contains? partner :chaplin)

And we also need the useful fact that nil equals nil.  Therefore the code we want looks like this:

(fn [k m]
    (contains? m k)
    (= (get m k) nil)))

No comments:

Post a Comment