Как сделать вызываемый объект в Clojure? - PullRequest
6 голосов
/ 05 декабря 2010

Как сделать вызываемый тип или объект в Clojure?

Например, как я могу определить запись Foo, принимающую одно значение :bar, которое можно вызвать для печати этого значения?

user=> (def foo (Foo. "Hello world"))
user=> (foo)
Hello World
user=> (:bar foo)
"Hello World"

1 Ответ

10 голосов
/ 05 декабря 2010
(defrecord Foo [bar]
  clojure.lang.IFn
  (invoke [_] (println bar)))

((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)))
...