2012-08-15 137 views
16

假设我有一个“类似于函数”的记录,至少在它表示可以应用于某些参数的操作的意义上。Clojure记录是否是实施IFn的好习惯?

我可以通过实施clojure.lang.IFn其作为函数的工作,是这样的:

(defrecord Func [f x] 
    clojure.lang.IFn 
    (invoke [this arg] 
     (f x arg)) 
    (applyTo [this args] 
     (apply f x args))) 

((->Func + 7) 1) 
=> 8 

(是的,我知道,我刚刚重新实现的partial劣质版本....这只是一个例子: - ))

正在创纪录的实现clojure.lang.IFn一个好的做法或不?

任何陷阱,以这种方式?

回答

6

我很惊讶,它没有了。记录应该是"a complete implementation of a persistent map"。所以要回答你的问题,我希望它是它的关键功能,就像地图一样;其他任何事情都会令人惊讶。

+1

A记录似乎实现'clojure.lang.Associative'但不是'clojure.lang.IFn'。所以你可以用'(:some-record)'来查找关键字,而不是'(some-record:x)' – mikera 2012-08-15 05:30:06

+0

准确地说。我已经检查过,但没有看到有关Rich的任何明确信息。也许这只是一个疏忽。 – 2012-08-15 05:31:32

+0

给出+1,因为@ mikera的问题询问记录不是类型。因为记录已经有了类似地图的语义,所以会令人困惑,因为类型这个问题不存在。 – ponzao 2012-08-15 08:24:56

相关问题