clojure.lang 真的只是实现细节吗?

2023-12-22

在 Clojure 中,一些任务(例如实例化PersistentQueue https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentQueue.java或使用deftype实现与以下兼容的自定义数据类型clojure.core函数)需要了解其中的类和/或接口clojure.lang https://github.com/clojure/clojure/tree/master/src/jvm/clojure/lang.

然而,根据clojure.lang/package.html https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/package.html:

唯一被视为公共 API 一部分的类是clojure.lang.IFn https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/IFn.java。所有其他类都应考虑实现细节。

这些说法是否不正确或过时?如果有,未来有计划纠正吗?如果没有,是否有更优选的方法来执行上述任务,或者根本不应该在惯用的 Clojure 代码中完成这些任务?


亚历克斯·米勒有评论了 https://groups.google.com/d/msg/clojure/2ZHYa-Bv8UU/31c7b6JaCd4J过去曾对此进行过讨论(尽管整个线程值得一读):

我想说 Clojure 的内部存在一系列“公共”性。

  • 新的 Clojure API (clojure.java.api.Clojure) 是供 Clojure 外部调用者使用的官方公共 API。该 API 基本上由解析变量和调用函数的方法组成。
  • 对于 Clojure 中的 Clojure 用户来说,几乎任何公开且具有文档字符串并显示在 api 文档中的 var 都可以被视为公共 API。
  • 私有或没有文档字符串的 Clojure 变量(例如公共 api 文档中省略了 var)可能是需要非常小心的地方。
  • Clojure 内部 Java 接口 [clojure.lang] 当然是为了让库构建者能够创建在 Clojure 世界中发挥作用的有用的东西。我不知道有人曾经说过它们是“公共的”,但我当然认为对可能破坏外部用户的核心界面的任何更改都会被非常仔细地考虑。
  • Clojure 内部 Java 类 [clojure.lang] 在大多数情况下应被视为私有,如有更改,恕不另行通知。即使那里也存在灰色地带。

一般来说,我们并不高度重视封装或隐藏内部结构。在大多数情况下,如果内部结构可能对高级用户做有趣的事情有用,那么它们就可以使用,但需要注意的是,你做的事情越奇怪,在未来的版本中就越有可能被意外破坏。

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

clojure.lang 真的只是实现细节吗? 的相关文章

  • Scala - Java = ? (或者 Clojure - Java = ?)

    开发人员可以在不懂 Java 的情况下使用 Scala 吗 开发人员可以在不懂 Java 的情况下使用 Clojure 吗 注意 例如 我是一名 C 开发人员 我在不了解任何 VB 的情况下使用 NET 当然 WF 4 0 使用 VB 进行
  • 如何在 Clojure 中链接 Promise

    在 Scala 中 您可以使用map and flatMap在未来的成功结果上运行函数 val x Future Int val y Future String x map toString 有没有比以下更好的 Clojure 类似物 de
  • 无法删除 IntelliJ/Cursive 中的括号

    我正在使用 IntelliJ Cursive 编写 Clojure 我发现 删除括号的唯一方法就是将其中的内容完全删除 然后才能将括号删除 例如 假设我有以下代码 list 我只想删除左括号 一旦我在左括号上按退格键 IDE 就会忽略此行为
  • 为什么我收到无法动态绑定非动态变量?

    我正在尝试使用 clojure tools trace 命名空间的 dotrace 函数 dotrace my function my function 5 但我收到了这个错误 IllegalStateException 无法动态绑定非动态
  • 什么是 fn* 以及 Clojure 如何引导?

    The Clojure core 的来源 https github com clojure clojure blob master src clj clojure core clj似乎假设预先存在fn 这是在哪里定义的 引导程序还需要什么
  • 如何在 Jetty 中以编程方式设置 gzip?

    我正在使用 Noir 和 clojure 编写一个网络应用程序 它使用 Jetty Jetty 有两种使用 gzip 的方法 一种用于静态 一种用于动态 它们在https stackoverflow com a 9113129 104021
  • 你能在 Clojure 中获取加载函数的“代码即数据”吗?

    换一种方式 好吧 代码就是数据 http groups google com group clojure browse thread thread 554cdc59d8a46f01 该线程解决了如何从源文件中读取的问题 但我想知道如何将已加
  • Clojure 中没有整数溢出?

    我在阅读时在 IntelliJ IDEA 中运行 Clojure 1 3 0 和 La ClojureClojure 的乐趣 在第 4 1 3 节 第 64 页 中 作者使用以下代码演示了整数溢出 Integer MAX VALUE Int
  • 如何在 RHEL 6.1 / JDK7 上安装 Clojure 1.3 with contribs?

    我一直在努力让它发挥作用 获取 clojure 1 3 是一件轻而易举的事 但现在我一直在尝试安装 contrib 库 但遇到了错误 有关于如何正确执行此操作的指南吗 旧的 clojure contrib 整体库与 clojure 1 3
  • Clojure MySQL 语法错误异常(“[...] 靠近 '???????????????' [...]”)

    除了建立连接之外 我在使用 clojure contrib sql 做任何事情时都遇到困难 我有一个 mysqld 在 localhost 3306 上运行 数据库名为clj db 用户 clj user localhost 和密码 clj
  • 如何检查spec/col-of中的不同ID

    s def users s coll of user distinct true 上面的规范要求每个用户映射都是不同的 但是我如何指定它来检查不同的 user ids only 不应允许以下集合 id 10 name Jessica id
  • 使用 swank-clojure 攻击 Clojure 库的工作流程

    Clojure 库的黑客攻击有典型的工作流程吗 假设我的应用程序 Foo 依赖于第三方库 Bar 该库是从存储库获取的 并通过以下方式包含在项目 Foo 中lein deps 然后 假设我想破解 Bar 库 所以我从 github 克隆它
  • 如何在 Compojure 中使用 lib-noir 有状态会话

    我想我这里有一个相当简单的问题 但我已经看这个屏幕太久了 所以我正在尝试 但失败了 让有状态会话在 Compojure 中工作 refheap代码粘贴is here https www refheap com paste 11161 你可以
  • 从外部 clojar 导入/使用资源

    我想做的是将一个大文件 MIDI 声音字体 打包到一个独立的 Maven repo clojar 中 然后能够以编程方式将其拉下来并从单独的项目中使用它 事实证明 这个看似简单的任务比我想象的要复杂 理想的情况是 如果有一种方法可以直接访问
  • Clojure 尾递归与质因数

    我正在尝试自学 clojure 并使用 Prime Factors Kata 和 TDD 的原则来实现这一目标 通过一系列 Midje 测试 如下所示 fact primefactors 1 gt list fact primefactor
  • 在 Clojure 中处理两个序列中的值对

    我正在尝试加入 Clojure 社区 我经常使用 Python 我广泛使用的功能之一是 zip 方法 用于迭代值对 在 Clojure 中是否有一种 聪明且简短的 方法可以实现相同的目标 另一种方法是简单地将 map 与一些按顺序收集其参数
  • Clojure 中的宏和函数

    我在这个 Clojure 教程中读到了以下行 http java ociweb com mark clojure article html Macros http java ociweb com mark clojure article h
  • 我应该如何使 Clojure STM 程序持久化?

    我正在编写一个使用 STM 的 clojure 程序 目前 我在启动时从数据库填充 STM 使用引用 然后在 dosync 事务成功时异步更新数据库 我不知道我是否以正确的方式这样做 或者是否有更好的标准技术来做到这一点 谁能向我解释一下他
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 当参数是大映射时跟踪函数

    当我跟踪一个函数时 如果其中一个参数是包含大量元素的嵌套映射 则跟踪会充满混乱 这是一个典型的例子 TRACE t36705 get value nodeclass simple nodeid simple25 dock constan t

随机推荐

  • C 和 C++ 中类型的互操作性

    一个非常简单的问题 是否有任何保证 Cint和 C 是一样的int 在同一系统上 不言而喻 这当然是一个纯粹的理论问题 C 和 C 标准使用相同的语言来定义基本类型 但是 Fortran 2003 明确指出 use ISO C BINDIN
  • 在 C 中将块指令作为宏的参数传递

    我不知道这是否可能 我想像参数一样在宏中传递指令块 我将向您展示一个示例 define ADD MACRO size BLOCK for int i 0 i
  • ASP NET MVC 3 - 如何首先使用两个表和 Database.Setinitializer 在代码中重置数据库?

    我的问题在于缺乏MVC经验 基本上 我在数据库中有两个表 人 提供 对于每个我都创建了一个模型 一个控制器和一个模型 因此结构如下所示 public class Offer public int OfferID get set public
  • 发送大尺寸图像、视频和音频时 XMPP 客户端断开连接

    我已经使用 robbiehanson xmpp 示例实现了 xmpp 我可以聊天 也可以发送图像 我发送的图像被转换为 nsdata 并进一步转换为 Base64String 然后发送字符串 self xmppStream sendElem
  • Google 日历 API 的换行符?

    我正在尝试从我的网络应用程序中插入 Google 日历中的事件描述 但无法获取 n 或 br 被解释为换行符 谷歌日历如何解释换行符 帮助将不胜感激 您使用特定的客户端库吗 如果使用该协议 只需在内容元素中添加换行符即可
  • Django 应用程序初始化代码(例如连接到信号)

    我需要一个地方来运行特定于应用程序的初始化代码 例如连接到信号 当我将代码放入 init py我最终得到了模型的循环导入 有没有办法在框架设置时和执行任何请求之前触发函数 我使用相当旧的 django 96 6 版本 但我也对当前版本的解决
  • CakePHP 保存外键问题

    我在将 用户 表的外键保存在另一个名为 基本 的表中时遇到问题 我试图向用户询问一系列问题 每个完成的系列问题和用户 ID 都应该保存到相应的表中 这是在模型中进行验证后保存我的数据的内容 验证成功 所有数据均已保存 但外键保存为 0 pu
  • 如何将Mandelbrot的每个像素计算划分到不同的节点上?

    我的问题是我应该使用什么数据结构将工作分配给每个线程并从中获取计算值 我首先想到的是用保存 x y 和 iterate value 的结构填充向量 0 向量 63999 对于800x800像素 将这些向量传递给每个节点 gt 然后将给定向量
  • 当元素数据更改时,jQuery data() 属性不会更新

    我想使用 jQuerydata api 用于检索元素的所有数据属性 但这个 api 的缓存性质确实很烦人 有时我需要更改 javascript 中元素的某些数据属性 但是data api 始终返回每个数据属性的初始值 所以我必须使用attr
  • 在python中创建具有一定宽度边框的图像

    我用过PIL back color width for x in range w for y in range h if x 0 or y 0 or x w 1 or y h 1 pixels x y back color 我需要向图像添加
  • 合并 pandas 数据框列表

    我有一个数据框列表 我需要使用唯一的列将它们合并在一起 date 字段名称不同 因此不能使用 concat 我可以手动使用df 0 merge df 1 on Date merge df 3 on Date 等等将每个df一一合并 但问题是
  • 即使用户允许,Gmail 也会隐藏外部电子邮件图像

    我正在尝试在 html 电子邮件中插入带有图像的签名 我在使用 GMail 时遇到一些问题 它在 iPhone 客户端上运行良好 在用户接受图像之前 它们的大小正确 并且替代文本可见 每个图像的 HTML 为 img alt Bonne w
  • 警告主要版本 52 比该编译器支持的最高主要版本 51 更新

    基本上我是超级新手 开始在IT公司实习 我用 Xamarin 安装了 VS 我面临的问题非常令人沮丧 因此 即使我创建空项目 我也无法编译它并收到如下错误 严重性代码 说明 项目文件行抑制状态 警告主要版本 52 比该编译器支持的最高主要版
  • 如何让 Eclipse 记住 Android SDK 位置?

    每当我尝试使用 Eclipse 创建新的 Android 项目 在空工作区中 时 构建目标 列表都是空的 因此 我需要取消 新建 Android 项目 对话框 然后转到首选项并重新输入 Android 的 SDK 位置 完成此操作后 我可以
  • Android:使用自定义视图从对话框中检索 EditText 值

    我使用 AlertDialog Builder 类创建了一个对话框 并调用 builder setView int resource 为其提供文本输入的自定义布局 当用户点击 确定 时 我试图从布局上的 EditText 检索值 但是当调用
  • 如何从div中删除class属性?

    我正在使用 JavaScript 如果单击按钮 我想添加 删除 Class 属性 我可以添加该类 但我不知道如何删除它 我怎样才能做到这一点 window onload function var buttonGo document getE
  • 何时使用表运算符 APPLY

    我试图理解表运算符APPLY 这是示例 CREATE TABLE y Name char 8 hoursWorked int GO INSERT INTO y VALUES jim 4 INSERT INTO y VALUES michae
  • 类型错误:无法读取 Proxy.$_setUpEditorEvents 处未定义的属性(读取“模型”)

    我正在尝试将 CKEditor 5 与 Laravel 中的 Inertia 应用程序一起使用 但在遵循文档后 我收到以下错误 索引 vue file
  • 将证书导入 VisualSVN 服务器

    是否可以将安装了VisualSVN的Windows Server的有效证书导入到VisualSVN中 阅读文章KB134 为 VisualSVN 服务器配置 SSL 证书 https www visualsvn com support to
  • clojure.lang 真的只是实现细节吗?

    在 Clojure 中 一些任务 例如实例化PersistentQueue https github com clojure clojure blob master src jvm clojure lang PersistentQueue