Могу ли я определить протокол Clojure с методами, начинающимися с «:»?

#clojure

#clojure

Вопрос:

Я хотел бы предоставить некоторые методы для протокола clojure, начинающиеся с символа :. Есть ли какой-либо способ переопределить это в Clojure?

Ответ №1:

Я так не думаю. Ключевые слова Clojure реализованы в reader, и я не думаю, что есть какой-либо способ переопределить это поведение.

Когда вы используете ключевое слово в качестве функции, это эквивалентно (get arg :ключевое слово). Вы можете расширить то, что это делает, внедрив ILookup в свой протокол.

Joost.

Ответ №2:

Звучит как плохая идея: двоеточия зарезервированы для ключевых слов, поэтому, даже если бы вы могли это сделать, я думаю, это привело бы к некоторому запутыванию кода.

Вы, конечно, можете поместить функцию внутри записи, сопоставленной с ключевым словом:

 (defrecord Foo [])

(def foo (Foo. nil {:method (fn [a b] (* a b))}))

((:method foo) 7 10)
=> 70
  

Иногда я обнаружил, что это полезный трюк……