你如何在Clojure中创建一个可调用的对象?

6 clojure callable

你如何在Clojure中创建一个可调用的类型或对象?

例如,我如何定义一个记录Foo,该记录采用:bar可以调用以打印该值的单个值?

user=> (def foo (Foo. "Hello world"))
user=> (foo)
Hello World
user=> (:bar foo)
"Hello World"
Run Code Online (Sandbox Code Playgroud)

May*_*iel 10

(defrecord Foo [bar]
  clojure.lang.IFn
  (invoke [_] (println bar)))
Run Code Online (Sandbox Code Playgroud)

((Foo. "Hello, world!"))

;; => Hello, world!

(:bar (Foo. "Hello, world!"))

;; => "Hello, world!"

......这是一个好主意是另一个问题.


实施IFn的记录

(defrecord Foo [bar]
  clojure.lang.IFn
  (invoke [_] (println bar))
  (applyTo [this args] (clojure.lang.AFn/applyToHelper this args)))
Run Code Online (Sandbox Code Playgroud)