在Clojure中代理命名参数的惯用方法

时间:2014-03-06 14:48:56

标签: clojure amazonica

我需要一个简单包装amazonicasqs/receive-message的函数,以便添加默认的等待时间。该函数需要一个队列URL,然后接受任意数量的可选命名参数,这些参数应该传递给sqs/receive-message未触及。我想这样称呼:

(my-receive-message "https://sqs.us-east-1.amazonaws.com/123/test-q"
                    :max-number-of-messages 10
                    :delete true)

这会导致调用sqs/receive-message,如下所示:

(sqs/receive-message :queue-url "https://sqs.us-east-1.amazonaws.com/123/test-q"
                     :wait-time-seconds 20
                     :max-number-of-messages 10
                     :delete true)

这是我发现自己想要经常做的事情,但我还没有找到一个好方法。有没有惯用的方法呢?

2 个答案:

答案 0 :(得分:5)

对合并的参数使用apply

(defn my-receive-message
  [url & {:as args}]
  (apply sqs/receive-message (-> {:queue-url url
                                  :wait-time-seconds 20}
                                 (merge args)
                                 seq 
                                 flatten)))

答案 1 :(得分:1)

你总是可以写一个宏:

(defmacro my-receive-message [url & opts]
  `(sqs/receive-message 
      ~@(flatten (seq (merge {:queue-url url :wait-time-seconds 20}
                             (apply hash-map opts))))))

(请注意,这与Guillermo的功能几乎完全相同。主要区别在于您不必apply sqs/receive-message - 非引号拼接(~@)照顾隐含地apply部分。)