为什么在clojure中实现协议时出现“不支持的绑定表单”错误?

时间:2014-01-26 00:08:02

标签: clojure jvm

我正在尝试在我写的clojure程序中实现一个带有记录的协议。我得到的错误是“不支持的绑定表单”。

    (defprotocol query-rows
        (query-text [table])
        (trans-cols [table rows])
        (set-max [table] [table id]))


    (defrecord Submissions [data max-id]
        query-rows
        (query-text [table] 
            (gen-query-text "SubmissionId" "Valid" "Submission"))
        (trans-cols [table rows]
            (let 
                [trans-data 
                    (->>
                        rows
                        (trans-col #(if % 1 0) :valid :valid_count)
                        (trans-col #(if % 0 1) :valid :non_valid_count)
                        (trans-col format-sql-date :createdon :date))]
                (assoc table :data trans-data)))
        (set-max 
            ([table]
                (when-let [id (gen-get-max "SubmissionAgg2")]
                (assoc table :max-id id)))
            ([table id] (assoc table :max-id id))))

“set-max”函数正在抛出错误。我有一种感觉,我试图错误地使用多个arity。有谁知道我做错了什么?

1 个答案:

答案 0 :(得分:4)

您已正确诊断出该问题。您需要按照http://clojure.org/protocols中的示例进行操作,并在defrecord主体中分别定义set-max方法的多个arities。

...
(set-max [table] ...)
(set-max [table id] ...)
...