为 Clojure 协议提供多种实现

2024-03-09

我有一个公开常见数据相关函数的命名空间(get-images, insert-user)。然后,我有两个具有相同功能并以不同方式实现它们的数据库后端。他们按原样实现接口。每个后端都包含在一个命名空间中。

我似乎无法找到如何完成此任务的良好解决方案。

我尝试动态加载ns但没有运气。一旦你这样做了(:require [abc :as x]), the x不是真正的值。

我尝试使用defprotocol and deftype但这很奇怪,因为deftype也需要进口,这让我的一切都变得混乱。

有一些惯用的解决方案吗?


我不明白为什么协议还不够?

在 ns data.api 中:

(ns data.api)
(defprotocol DB
  (get-images [this]) 
  (insert-user [this]))

在 ns data.impl1 中:

(ns data.impl1
  (:require [data.api :refer :all]))

(defrecord Database1 [connection-params]
  DB
  (get-images [_] ...)
  (insert-user [_] ...))

ns data.impl2 中也有同样的事情。

然后,当您要使用特定数据库时,只需创建正确的记录:

(ns data.user
  (:require [data.api :refer :all])
            [data.impl1 :refer (->Database1)])

(defn use-db []
  (let [db1 (->Database1 {})]
    (get-images db1)))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为 Clojure 协议提供多种实现 的相关文章

  • 在 Clojure 中实现中断

    如果条件匹配返回最后一个值 有没有办法在 Clojure 中跳出循环 大多数算法受益于在找到结果时返回结果并避免完成整个执行 假设我有一个由 100 个数字组成的向量 范围从 0 到 100 我想找到数字 10 一旦找到 10 我希望停止执
  • 尾递归函数上的 StackOverflowError

    当我使用 avg bids 4000 10 5 调用以下 Clojure 代码时 会导致 java lang StackOverflowError 我试图找出原因 因为 sum bids 是作为尾递归函数编写的 所以应该可以工作 使用 Cl
  • Clojure 是否有命名私有函数的约定?

    当我在 Clojure 中定义私有函数时 我通常使用 前缀作为视觉指示符 表明该函数不能在我的命名空间之外使用 例如 defn name let formatter formatter yyyy MM dd HH mm ss SSSS fo
  • 如何将 Clojure memfn 与 Java 构造函数一起使用?

    我想使用 Java 构造函数作为一流的 Clojure 函数 我的用例是将字符串序列转换为具有单个字符串构造函数的 Java 对象序列 简单的Java对象 public class Foo public Foo String aString
  • Clojure:在 let 绑定中展开 var

    我想在let不同功能的形式 比方说 def common assign x 10 y 20 一种方法是用eval eval defn foo let common assign hello world balala 问题是现在你必须引用所有
  • 在 Clojure 中使用 http://foobar.mp3 重定向到 http://fizzbar.mp3

    我正在尝试以编程方式下载 mp3 文件这个 RSS 提要 http podcast menlo church feed 当我打开一个网址时 例如 http menlohurch podbean com mf feed 5gv2gb 1702
  • Clojure 中使用 clj-http 进行基本身份验证

    我们正在使用clj http https github com dakrone clj http进行 HTTP 基本身份验证 我想发送带有此标头的请求 Authorization Basic dXNlcm5hbWU6cGFzc3dvcmQ
  • Clojure 中的相互递归定义

    如何在 Clojure 中进行相互递归定义 下面是 Scala 中使用递归定义查找素数的代码 val odds Stream Int cons 3 odds map 2 val primes Stream Int cons 2 odds f
  • 懒惰的 juxt 函数有什么优点吗?

    在回答中一个问题 https stackoverflow com questions 10044254 is there a reverse map function关于一个使用相同参数映射多个函数的函数 A juxt 我想出了一个基本上采
  • Clojure:在特定命名空间中启动 repl

    我安装了 boot clj 并且希望能够在外部编辑器中编辑 clj 文件 并单独运行一个命令行 REPL 我可以从中调用我在 clj 文件中更改的函数 不需要特殊的重新加载命令 另一件事是我不想手动键入命令来包含命名空间 我只想运行一个将我
  • 在 Clojure 中创建映射条目

    是什么built inClojure 方式 如果有 创建单个映射条目 换句话说 我想要类似的东西 map entry key value 换句话说 结果应该或多或少等于 first key value Remarks 当然 我已经尝试过谷歌
  • 在环形应用程序中捕获异常的惯用方法

    处理环形应用程序中的异常的惯用方法是什么 我想捕获异常并返回 500 页 我怎么做 我在下面的代码中使用了 Mustache 但是它不起作用 def my app try app wrap logger true wrap keyword
  • 如何使用 core.async 在 Clojure 中写入日志文件?

    我想使用 core async 作为写入文件的记录器 因此我创建了一个 test txt 文件 将其粘贴在我的资源文件夹中并编写了以下代码 use clojure java io use clojure core async def pri
  • 从命令行将 clojure 源代码编译为类(AOT)(不使用 lein)

    我正在尝试将 clojure 源代码编译成类文件 并仅使用命令行运行它 没有 lein 也没有 可能 回复 我有 core cljsrc hello目录 src hello core clj 这是源代码 ns hello core defn
  • 为什么这个 Clojure 减速器 r/fold 没有提供任何性能优势?

    我想知道为什么下面的代码在 r fold 的情况下没有提供加速 我对减速器有什么误解吗 我在一个相当慢的 尽管有 2 个核心 Ubuntu 12 04 开发盒上运行它 通过 emacs 和 lein 运行 每个都有相同的结果 require
  • Clojure / Noir:强制 HTTPS,如果请求是 http:// 则重定向到 https://

    我正在尝试在我的网站上强制使用 SSL 我想要一个环形中间件 将网站重定向到与 https 相同的 URL 如果它只是 http 我编写了以下代码 但除了检查请求方案并打印它应该重定向到的 URL 之外 它实际上没有做任何事情 defn h
  • 为什么leiningen启动时那么慢?

    我在用着lein repl在控制台中执行 clojure repl 当我运行它时 需要超过15秒 当我跑步时java cp clojure 1 6 0 jar clojure main 只需几秒钟 Why is lein repl太慢了 有
  • Clojure 中 with-local-vars 和 with-bounds 之间的区别

    Clojure 的文档with local vars http clojuredocs org clojure core clojure core with local vars and with bindings http clojure
  • 将向量作为绑定传递给 for 宏时出现问题

    我有任意数量的列表 我想使用 for 宏来处理它们 我想创建一个传递向量作为绑定的函数 因为列表的数量各不相同 如果我对绑定进行硬编码 它会按我的预期工作 gt def list1 pink green gt def list2 dog c
  • Clojure Web 应用程序 - 我从哪里开始?

    最近我一直在研究 Clojure 我喜欢这门语言 我想看看我是否可以在其中制作一个小型网络应用程序 只是为了挑战自己 但是 我完全没有设置任何与 Java 相关的 Web 应用程序的经验 事实上 我对 Java 并没有太多的经验 我从哪说起

随机推荐

  • 验证 Azure Active Directory 中的用户;不使用 SSO,但使用用户名和密码

    随着最近发布的 Azure AD 我们希望使用 Azure AD 进行 Web 应用程序身份验证 但不想使用 SSO 我们不希望用户被重定向到 Microsoft 帐户登录屏幕 然后再返回 我们希望向他们提供登录凭据屏幕 在其中捕获他们的用
  • 如何在 Java GUI 上添加多行标签?

    我做了一个java swing GUI 现在我想在其上显示一条静态消息 但该消息是多行的 而 JLabel 是单行的 我怎样才能显示该消息 我们可以设置 JLabel 的任何属性来显示多行消息吗 我是否必须对多行使用多个 JLabel 还有
  • 词典排序

    我正在做一个问题 说 连接单词以生成字典顺序最低的可能字符串 来自一场比赛 以这个字符串为例 jibw ji jp bw jibw 实际输出结果是 bw jibw jibw ji jp 当我对此进行排序时 我得到 bw ji jibw ji
  • Java 类加载器和依赖解析

    有人可以澄清一下 类加载器的作用不仅是加载单个类 而且还加载其依赖项吗 如果是这样 整个过程到底需要什么 如果可能的话 我正在寻找实施细节 例如 在某些时候 必须从某个地方 网络或文件系统位置 读取字节 并且必须根据类规范名称和类的预知来计
  • Hyperledger Fabric 中的多个智能合约

    如何在 Hyperledger Fabric 的同一个应用程序中实施多个智能合约 哪个配置文件包含实现此目的的设置 我将使用 Hyperledger Fabric 版本 1 4 中的 Fabcar 示例来回答您的问题 我的回答是基于 Jav
  • OPC 新手指南:如何编写 C# Hello World 客户端?

    这是我的情况 我们开发了一款用于监控太阳能发电厂的软件 我必须介绍 OPC 作为一种从物理设备本身获取数据的新方法 这就是为什么我最终尝试了解 OPC 但迄今为止这令人沮丧 我已经安装了 Matrikon 模拟器 并使用 Matrikon
  • Jquery - 将html字符串附加到变量中的html字符串

    我正在尝试创建一个 HTML 字符串 然后使用额外的 HTML 和属性修改该 HTML 字符串 但它不起作用 我究竟做错了什么 document ready function body on click button function va
  • 将激活上下文 API 与不同位置的许多 dll 一起使用

    我在位置 A 运行的 Net 客户端中使用激活上下文 API 在 WS2008 上的位置 B 与 A 完全不同的位置 不是同一台计算机上的同级 后代等 加载 COM 组件 无需注册通过在 ACTCTX 中传递位置 B 它工作正常 但是 我现
  • 主线程执行完成后,Spring Batch 线程不返回

    我是春季批次的新手 我已经通过使用多个线程从 spring 创建并成功执行了作业 它工作得很好 除了程序执行完成时 程序流不会结束 停止 即 即使主方法的最后一条语句被执行 程序也不会退出 我不确定它是否继续等待线程完成或什么 有人可以就此
  • 不使用 Excel 写入 Excel 电子表格中的某些单元格?

    我想在未安装 Excel 的服务器上写入 Excel 电子表格 所以Excel自动化是不可能的 我还需要写信给certain使用 NET 的单元 这可能吗 如何实现 ODBC 驱动程序可用于在某些工作表单元格插入数据吗 无需使用昂贵的第三方
  • Assert.That 与 Assert.True

    更喜欢什么 Assert That obj Foo Is EqualTo true or Assert True obj Foo 对我来说 这两种资产是等价的 应该优先选择哪一种 在这种特殊情况下 没有区别 您将看到大致相同详细程度的输出
  • IntelliJ IDEA 中的“变量从未分配”警告只能“部分”抑制

    Java EE IntelliJ Idea 2016 3 我编写了一个类并声明了一个私有字段 Inject注解 我已经通过添加成功地从 检查结果 窗口中删除了 未使用的声明 通知javax inject Inject to 设置 gt 编辑
  • grunt-contrib-connect 中间件 CORS 解决方案,具有 keepalive true

    对于我的本地开发系统 我尝试使用 grunt contrib connect 为前端资产提供服务 我需要一个在 Firefox 中使用字体的跨域解决方案 服务器运行得很好 但我似乎无法设置标头 我正在使用 grunt contrib con
  • 单个元素中的多个文本节点?

    有人可以帮我看一下下面的屏幕截图并解释以下内容 到底是怎么回事 我如何以编程方式检测它 我如何以编程方式修复 摆脱它 我相信发生的事情是我在一个单一的文本节点中有多个文本节点preelement 我感觉很多年前我在MDN上读到这样的事情是可
  • android:dither="true" 不抖动,出了什么问题?

    我一直在尝试让 android 抖动活动的背景图像 到目前为止没有成功 我不知道出了什么问题 这就是我所做的 我的活动布局的根元素是 LinearLayout
  • 为什么自定义类型接受 Python 中的临时属性(而内置类型不接受)?

    我想知道为什么人们能够为自定义类型的实例创建一个新属性 新 意味着 先前未在类主体中定义 但无法为内置类型执行相同的操作在类型上 比如object本身 代码示例 gt gt gt class SomeClass object pass gt
  • Python导入模块错误

    我在项目中导入模块时遇到问题 我正在创建测试 但无法从测试文件导入我的 main 来测试应用程序的一个端点teste ex py 这是我的项目结构 backend api api init py main py testes init py
  • 如何在django模板中使用生成器方法?

    我想在 django 模板中使用 python 生成器 可以吗 例如 我有模型 它包含生成器对象 如下所示 class TestMe models Model property def gen self yield 1 yield 2 上下
  • Pycharm不显示数据库表

    更新PyCharm 版本2017 1 后 PyCharm不显示sqlite3数据库表不再存在 我已经测试了连接并且可以正常工作 In sqlite客户端我可以列出所有表并进行查询 其他人也遇到这个问题吗 在这种情况下无论如何都能解决吗 我使
  • 为 Clojure 协议提供多种实现

    我有一个公开常见数据相关函数的命名空间 get images insert user 然后 我有两个具有相同功能并以不同方式实现它们的数据库后端 他们按原样实现接口 每个后端都包含在一个命名空间中 我似乎无法找到如何完成此任务的良好解决方案