gpt4 book ai didi

function - Clojure 中的命名空间之间共享函数

转载 作者:行者123 更新时间:2023-12-04 04:12:13 24 4
gpt4 key购买 nike

我很可能以错误的方式处理这个问题,所以请原谅我的天真:

为了学习 Clojure,我已经开始将我的 Python OAuth 客户端库移植到 Clojure。我通过包装 clj-http 来做到这一点,就像我在 Python 库中包装 Python 请求一样。到目前为止,这似乎工作得很好,我真的很高兴看到实现在 Clojure 中实现。

但是我遇到了一个问题:我计划同时支持 OAuth 1.0 和 2.0,并将各自的功能分成两个文件:oauth1.clj 和 oauth2.clj。现在,理想情况下,每个文件都应该公开一组与 HTTP 动词对应的函数。

(ns accord.oauth2)

...

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

这些函数本质上是相同的,实际上现在在 oauth1.clj 和 oauth2.clj 之间是完全相同的。我的第一 react 是将这些函数移动到 core.clj 中,然后在各自的 OAuth 命名空间(oauth1、oauth2)中要求它们,以避免重复编写相同的代码。

只要我在文件中使用引用的函数,即 oauth1.clj 或 oauth2.clj,这很好。但是假设我们想按照我的意图使用这个库(在 REPL 中,或者在你的程序中),如下所示:
=> (require '[accord.oauth2 :as oauth2])  ;; require the library's oauth2 namespace

...

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

变量 oauth2/get未找到,因为仅将其拉入 oauth2.clj 中的 namespace 似乎并没有像它实际上在该 namespace 中那样公开它。我不想用更多的功能来包装它们,因为这基本上违背了目的;这些函数非常简单(它们只是包装了一个 request 函数),基本上,如果我要这样做的话,我会在三个地方编写它们。

我确信我没有正确地在 Clojure 中理解命名空间,而且可能是惯用地思考抽象问题和代码共享的一般方式。

所以我想知道这个的惯用解决方案是什么?我会以完全错误的方式解决这个问题吗?

编辑:

这是问题的简化: https://gist.github.com/maxcountryman/5228259

请注意,目标是一次性编写 HTTP 动词函数。他们不需要特殊的调度类型或类似的东西。他们已经很好了。问题是它们没有从 accord.oauth1 中暴露出来。或 accord.oauth2 ,即当您的程序需要 accord.oauth2例如。

如果这是 Python,我们可以像这样导入函数: from accord.core import get, post, put, ...进入 accord.oauth1accord.oauth2然后当我们使用 accord.oauth1模块,我们可以访问所有这些导入的函数,例如 import accord.oauth2 as oauth2 ... oauth2.get(...) .

我们如何在 Clojure 中做到这一点,或者我们应该如何惯用地提供这种 DRY 抽象?

最佳答案

考虑看看 Zach Tellman 的图书馆 Potemkin . Zach 将其描述为“用于重组命名空间和代码结构的函数集合”。

波将金并非没有争议。 Here's Clojure 邮件列表上的一个线程的开头,Stuart Sierra 很清楚他不是这个想法的粉丝。

关于function - Clojure 中的命名空间之间共享函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15580807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com