Compartiendo funciones entre espacios de nombres en Clojure

Es muy posible que me esté acercando a esto de manera incorrecta, así que, por favor, perdónenme mi ingenuidad:

Para aprender Clojure, comencé a portar mi biblioteca cliente OAuth para Python a Clojure. Estoy haciendo esto envolviendo clj-http de la misma manera que envuelvo las solicitudes de Python en la biblioteca de Python. Parece que esto está funcionando bastante bien hasta ahora y estoy disfrutando mucho ver cómo la implementación cobra vida en Clojure.

Sin embargo, me he encontrado con un problema: planeo admitir OAuth 1.0 y 2.0 y he dividido las funciones respectivas en dos archivos: oauth1.clj y oauth2.clj. Ahora, cada archivo idealmente debería exponer un conjunto de funciones que corresponden a verbos HTTP.

(ns accord.oauth2)

...

(defn get
  [serv uri & [req]]
  ((:request serv) serv (merge req {:method :get :url uri})))

Estas funciones serán esencialmente idénticas y, de hecho, en este momento son completamente idénticas entre oauth1.clj y oauth2.clj. Mi primera reacción fue mover estas funciones a core.clj y luego solicitarlas en los respectivos espacios de nombres de OAuth (oauth1, oauth2) para evitar escribir el mismo código dos veces.

Esto está bien siempre y cuando use las funciones referidas en el archivo, es decir, oauth1.clj o oauth2.clj. Pero digamos que queremos usar esta biblioteca como pretendo (aquí en el REPL, alternativamente su programa), algo como esto:

=> (require '[accord.oauth2 :as oauth2])  ;; require the library's oauth2 namespace

...

=> (oauth2/get my-service "http://example.com/endpoint")  ;; use the HTTP functions

La varoauth2/get no se encuentra porque al insertarlo en el espacio de nombres solo en oauth2.clj no parece exponerlo como si realmente estuviera en ese espacio de nombres. No quiero envolverlos con más funciones, porque eso básicamente anula el propósito; Las funciones son tan simples (sólo envuelven unarequest Función) Los escribiría en tres lugares, esencialmente, si tuviera que hacer eso.

Estoy seguro de que no estoy escribiendo correctamente los espacios de nombres en Clojure y, además, tal vez la forma general de pensar acerca de los problemas de abstracción y el uso compartido de código de forma idiomática.

Así que me pregunto cuál es la solución idiomática a esto? ¿Estoy haciendo esto completamente por el camino equivocado?

Editar:

Aquí hay una simplificación del problema:https://gist.github.com/maxcountryman/5228259

Tenga en cuenta que el objetivo es escribir las funciones del verbo HTTP una vez. No necesitan tipos especiales de despacho o algo así. Ya están bien como están. El problema es que no están expuestos desdeaccord.oauth1 oaccord.oauth2, es decir, cuando su programa requiereaccord.oauth2 por ejemplo.

Si esto fuera Python, podríamos importar las funciones de esta manera:from accord.core import get, post, put, ... dentroaccord.oauth1 yaccord.oauth2 y luego cuando usamos elaccord.oauth1 módulo tendríamos acceso a todas esas funciones importadas, por ejemplo,import accord.oauth2 as oauth2 ...oauth2.get(...).

¿Cómo podemos hacer esto en Clojure o cómo deberíamos prever idiomáticamente este tipo de abstracción DRY?

Respuestas a la pregunta(3)

Su respuesta a la pregunta