如何使用名称作为键从一组绑定创建一个映射?

Fix*_*int 1 clojure

我想要一些像{:keys [...]}构造的反转:

(let [x 1 y 2 z 3] (create-map x y z))

......应该回来{:x 1 :y 2 :z 3}.

换句话说,我想避免两次输入每个变量的名称{:x x :y y :z z}.

我想要这个功能的一个例子:

(defn create-some-service-handle [user-id password api-key] 
    { :api-key api-key 
      :user-id user-id 
      :connection (obtain-connection user-id password) })
Run Code Online (Sandbox Code Playgroud)

Omr*_*ein 7

如果您正在寻找能够准确定位于哪里create-map的东西,那么您将需要一个宏,因为您需要将这些符号取消评估.这将是一个非常简单的宏:

(defmacro create-map
  [& syms]
  (zipmap (map keyword syms) syms))
Run Code Online (Sandbox Code Playgroud)

这只是发生未计算的符号,mapŞ keyword下他们获得的关键字的序列,那么zipmapS采用原始符号的按键顺序.由于它是一个宏,在此之后将评估结果表单,产生关键字到值的映射(符号引用的值).

所以,如果你去做:

(let [x 1 y 2 z 3] (create-map x y z))
Run Code Online (Sandbox Code Playgroud)

......它将返回:

{:x 1 y 2 :z 3}
Run Code Online (Sandbox Code Playgroud)

这是你想要的?