如何从一系列值中创建记录

Nev*_*ena 11 clojure

例如,我有一个简单的记录定义

(defrecord User [name email place])
Run Code Online (Sandbox Code Playgroud)

在序列中创建记录值的最佳方法是什么?

(def my-values ["John" "john@example.com" "Dreamland"])
Run Code Online (Sandbox Code Playgroud)

我希望有类似的东西

(apply User. my-values)
Run Code Online (Sandbox Code Playgroud)

但那不行.我最终做了:

(defn make-user [v]
  (User. (nth v 0) (nth v 1) (nth v 2)))
Run Code Online (Sandbox Code Playgroud)

但我感觉有一些更好的方法来实现这一目标......

Gor*_*vic 4

警告:仅适用于字面序列!(参见 Miha\xc5\x82\ 的评论)

\n\n

试试这个宏:

\n\n
(defmacro instantiate [klass values] \n        `(new ~klass ~@values))\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您将其扩展为:

\n\n

(macroexpand \'(instantiate User ["John" "john@example.com" "Dreamland"]))

\n\n

你会得到这个:

\n\n

(new User "John" "john@example.com" "Dreamland")

\n\n

这基本上就是你所需要的。

\n\n

您可以使用它来实例化其他记录类型或 Java 类。基本上,这只是一个类构造函数,它采用一个参数序列而不是多个参数。

\n