Why should I use 'apply' in Clojure?

后端 未结 6 1737
执念已碎
执念已碎 2021-01-30 08:34

This is what Rich Hickey said in one of the blog posts but I don\'t understand the motivation in using apply. Please help.

A big difference between Clojur

6条回答
  •  清歌不尽
    2021-01-30 09:20

    You use apply to convert a function that works on several arguments to one that works on a single sequence of arguments. You can also insert arguments before the sequence. For example, map can work on several sequences. This example (from ClojureDocs) uses map to transpose a matrix.

    user=> (apply map vector [[:a :b] [:c :d]])
    ([:a :c] [:b :d])
    

    The one inserted argument here is vector. So the apply expands to

    user=> (map vector [:a :b] [:c :d])
    

    Cute!

    PS To return a vector of vectors instead of a sequence of vectors, wrap the whole thing in vec:

    user=> (vec (apply map vector [[:a :b] [:c :d]]))
    

    While we're here, vec could be defined as (partial apply vector), though it isn't.

    Concerning Lisp-1 and Lisp-2: the 1 and 2 indicate the number of things a name can denote in a given context. In a Lisp-2, you can have two different things (a function and a variable) with the same name. So, wherever either might be valid, you need to decorate your program with something to indicate which you mean. Thankfully, Clojure (or Scheme ...) allows a name to denote just one thing, so no such decorations are necessary.

提交回复
热议问题