keys and vals could be any kind of collection. Calling seq will return 
either nil or a seq with at least one value. By forcing empty collections 
to nil allows the (and ks vs) to work.

That is if keys is [] and vals is [1], then:

(and keys vals) is [1] (a truthy value)

But (seq []) is nil and (seq [1]) is (1) and (and nil (1)) is nil (a falsey 
value).

There are a lot of ways zipmap's performance can be improved (particularly 
if keys and vals are reducible) and there is a ticket where some ideas have 
been discussed: http://dev.clojure.org/jira/browse/CLJ-1005

On Tuesday, November 29, 2016 at 9:42:48 PM UTC-6, larry google groups 
wrote:
>
> I apologize for this question, because I think it has been asked before, 
> and yet I can not find the answer. 
>
> In the definition of zipmap, what do these 2 lines do?
>
> ks (seq keys)
> vs (seq vals)
>
> In particular, what is (seq) doing? Is this to ensure that ks is false if 
> "keys" is empty? And vs is false if "vals" is empty? Because an empty list 
> (or vector) is truthy but we want it to be falsey in this situation?  
>
> Is there any other reason to use (seq), other than to set the 
> truthy/falsey values of ks and vs? 
>
>
> (defn zipmap
> "Returns a map with the keys mapped to the corresponding vals."
> {:added "1.0"
> :static true}
> [keys vals]
> (loop [map {}
> ks (seq keys)
> vs (seq vals)]
> (if (and ks vs)
> (recur (assoc map (first ks) (first vs))
> (next ks)
> (next vs))
> map))) 
>

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to