Skip to content

Instantly share code, notes, and snippets.

@zahardzhan
Created February 2, 2010 05:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zahardzhan/292403 to your computer and use it in GitHub Desktop.
Save zahardzhan/292403 to your computer and use it in GitHub Desktop.
(defn fn-or
"Объединение функций возвращает функцию эквивалентную
(fn [x] (or (f x) (g x) ... ) или
(fn [x & xs] (or (f x1 x2 ...) (g x1 x2 ...) ... )"
[f & fs]
(if-not fs f (let [chain (apply fn-or fs)]
(fn ([x] (or (f x) (chain x)))
([x & xs] (or (apply f x xs) (apply chain x xs)))))))
(defn seq-dispatch
"Диспетчер возвращает ключ :seq, если в мультиметод передано много аргументов."
([] nil)
([x & xs] (when xs :seq)))
(defn type-dispatch
"Диспетчер первого аргумента по ключу типа (:type) в просто хэше или хэше внутри ссылки."
([] nil)
([r & xs] (:type (derefed r))))
(defn agent-dispatch
"Диспетчер возвращает ключ :agent, если первый аргумент - агент."
([] nil)
([a & xs] (when (agent? a) :agent)))
aux> ((fn-ors seq-dispatch agent-dispatch type-dispatch) (agent {:type 1}) 2)
:seq
aux> ((fn-ors seq-dispatch agent-dispatch type-dispatch) (agent {:type 1}))
:agent
aux> ((fn-ors seq-dispatch agent-dispatch type-dispatch) {:type 1})
1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment