Compartilhando funções entre namespaces no Clojure

Eu posso muito bem estar se aproximando disso da maneira errada, então por favor me perdoe da minha ingenuidade:

Para aprender o Clojure, comecei a portar minha biblioteca cliente OAuth para Python para o Clojure. Eu estou fazendo isso envolvendo o clj-http da mesma maneira que eu envolvo pedidos do Python na biblioteca Python. Isso parece estar funcionando muito bem até agora e estou realmente gostando de ver a implementação ganhar vida no Clojure.

No entanto, encontrei um problema: estou planejando dar suporte ao OAuth 1.0 e ao 2.0 e dividi as respectivas funções em dois arquivos: oauth1.clj e oauth2.clj. Agora, cada arquivo deve idealmente expor um conjunto de funções que correspondem a verbos HTTP.

(ns accord.oauth2)

...

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

Essas funções serão essencialmente idênticas e, de fato, agora são completamente idênticas entre oauth1.clj e oauth2.clj. Minha primeira reação foi mover essas funções para core.clj e, em seguida, exigi-las nos namespaces OAuth respectivos (oauth1, oauth2) para evitar escrever o mesmo código duas vezes.

Isso é bom, desde que eu use as funções referidas no arquivo, ou seja, oauth1.clj ou oauth2.clj. Mas digamos que queremos usar essa biblioteca como pretendo (aqui no REPL, alternativamente seu programa), algo assim:

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

...

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

O varoauth2/get não é encontrado porque puxá-lo para o namespace em oauth2.clj sozinho não parece expô-lo como se estivesse realmente nesse namespace. Eu não quero envolvê-los com mais funções, porque isso basicamente anula o propósito; as funções são tão simples (elas apenas envolvemrequest função) Eu estaria escrevendo-os em três lugares, essencialmente, se eu fosse fazer isso.

Tenho certeza de que não estou ganhando espaços de nomes no Clojure corretamente e, além disso, talvez a maneira geral de pensar sobre problemas de abstração e compartilhamento de código de forma idiomática.

Então, eu estou querendo saber qual é a solução idiomática para isso? Eu estou indo sobre isso completamente do jeito errado?

Editar:

Aqui está uma simplificação do problema:https://gist.github.com/maxcountryman/5228259

Observe que o objetivo é gravar as funções do verbo HTTP uma vez. Eles não precisam de tipos especiais de despacho ou algo assim. Eles já estão bem como estão. A questão é que eles não estão expostosaccord.oauth1 ouaccord.oauth2, ou seja, quando o seu programa exigiraccord.oauth2 por exemplo.

Se este fosse o Python, poderíamos apenas importar as funções como esta:from accord.core import get, post, put, ... para dentroaccord.oauth1 eaccord.oauth2 e depois, quando usamos oaccord.oauth1 módulo teríamos acesso a todas essas funções importadas, por exemploimport accord.oauth2 as oauth2 ...oauth2.get(...).

Como podemos fazer isso no Clojure ou como devemos fornecer, de maneira idiossincrática, esse tipo de abstração DRY?

questionAnswers(3)

yourAnswerToTheQuestion