Search code examples
clojure

How to make a record from a sequence of values


I have a simple record definition, for example

(defrecord User [name email place])

What is the best way to make a record having it's values in a sequence

(def my-values ["John" "[email protected]" "Dreamland"])

I hoped for something like

(apply User. my-values)

but that won't work. I ended up doing:

(defn make-user [v]
  (User. (nth v 0) (nth v 1) (nth v 2)))

But I'm sensing there is some better way for achieving this...


Solution

  • Warning: works only for literal sequables! (see Mihał's comment)

    Try this macro:

    (defmacro instantiate [klass values] 
            `(new ~klass ~@values))
    

    If you expand it with:

    (macroexpand '(instantiate User ["John" "[email protected]" "Dreamland"]))

    you'll get this:

    (new User "John" "[email protected]" "Dreamland")

    which is basically what you need.

    And you can use it for instantiating other record types, or Java classes. Basically, this is just a class constructor that takes a one sequence of parameters instead of many parameters.