请在 2024 Clojure 状态调查! 分享您的想法。

欢迎!请查看关于页面了解更多这方面的信息。

+2
Clojure
已关闭

ClojureScript 有 {{uuid}} 和 {{random-uuid}} 函数。这些函数在 ClojureScript 中非常方便,我认为在 Clojure 中也很有用,可以提高代码的可移植性。对此有兴趣吗?提供补丁的意愿如何?

关闭时附注: Clojure 1.11.0-alpha3 已添加 `random-uuid` 和 `parse-uuid` 函数

8 条回答

+1

评论者:wilkerlucio

(链接: ~alexmiller) 我明白让它们完全兼容将会很好。但坦诚地说,作为一个经常编写 CLJC 的用户,如果我们只是有了 uuidrandom-uuid (特别是后者),将解决我 99% 的 UUID 需要,我想对大多数人来说也是如此。我们不能从那些对所有人使用的肯定获胜的人开始,将详细的 UUID 设计留在一个单独的条目上吗?

今天我自己也遇到了这个问题。在 `.clj` 文件中输入了 `uuid` 希望像在 ClojureScript 中所做的那样,从一个字符串构建一个 uuid。导入 `java.util.UUID` 并调用 `UUID/fromString` 运行良好,但如果 `uuid` 是 `clojure.core` 的函数,那就更好了。另外,同意将 `clojure.core` 中的 `random-uuid` 加入到可移植性中(而不是我们现在使用的 `UUID/randomUUID`)。
0

由:alexmiller 发表评论

我认为做这件事情的主要原因是为了可移植性。最合理的方法是生成java.util.UUIDs - 这是否与ClojureScript中的做法相调和?也就是说,创建和**使用**uuids的相同代码是否能在两个平台上工作?如果不能,那么可能没有很好的理由去做这件事。

0

评论来自:[email protected]

最合理的方法是生成java.util.UUIDs - 这是否与ClojureScript中的做法相调和?

ClojureScript定义了自己的UUID类型,因为JavaScript中没有。《a rel="nofollow" href="https://github.com/clojure/clojurescript/blob/dd589037f242b4eaace113ffa28ab7b3791caf47/src/main/cljs/cljs/core.cljs#L10088-L10128" target="_blank" class="text-database-link">https://github.com/clojure/clojurescript/blob/dd589037f242b4eaace113ffa28ab7b3791caf47/src/main/cljs/cljs/core.cljs#L10088-L10128。我不太清楚你所说的调和是什么意思。

也就是说,创建和使用的uuids的相同代码是否能在两个平台上工作?

CLJS UUID不支持Java UUID的所有方法,但重要的功能都有(等价性、从字符串构建、将字符串打印出来),这些足以在使用UUID时显著提高可移植性。

0

评论来自:bronsa

Clojure和ClojureScript都有带标签的UUID字面量,这应该足够用于互操作性。

0

由:alexmiller 发表评论

我知道这一点,只是想知道是否有什么可能在uuid上调用的函数需要一些可移植的对等函数,就像http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html中那些内容。

0
评论人:[email protected]

这里的大部分额外方法都是用来区分多种类型的UUID,或者从基于时间的UUID中获取信息。


clockSequence() - 基于时间
compareTo(UUID val) - 不确定是否需要等效
boolean equals(Object obj) - 无需操作
static UUID fromString(String name) - 构造函数
long getLeastSignificantBits() - 不确定这两个的重要性
long getMostSignificantBits()
int hashCode() - 无需操作
static UUID nameUUIDFromBytes(byte[] name) - 这是否有用/重要?
long node() - 只适用于基于时间的UUID
static UUID randomUUID() - 将实现此功能
long timestamp() - 基于时间的UUID
String toString() - 无需操作
int variant() - 用于区分不同类型的UUID
int version() - 用于区分不同版本的UUID



我可能会在这里添加基于时间的UUID,但我不确定它们使用是否足够多以至于值得这样做,并且它们还需要添加到CLJS等。

在Clojure代码中使用了其中一些方法
https://github.com/search?l=clojure&q=.getLeastSignificantBits&type=Code&utf8=✓
https://github.com/search?utf8=✓&q="nameUUIDFromBytes" language:clojure&type=Code&ref=searchresults

但与直接的构造函数相比,使用频率要低约100倍
https://github.com/search?utf8=✓&q=java+util+UUID+language%3Aclojure&type=Code&ref=searchresults(这是一个有缺陷的搜索查询,但是最接近的)。
0

由:alexmiller 发表评论

我的主要观点可能是:与其只考虑uuid/random-uuid函数,不如考虑将问题视为:如何在我们感兴趣的Clojure/ClojureScript中添加可移植的UUID支持?这在工作量上要大得多,但据我看来要更有价值。

以下也需要考虑(一些已经存在,但可能还没有针对可移植性进行测试)
- 构建
- 打印 - 打印,pr,格式化打印
- 读取
- 哈希码
- 比特转换为字符串以及字符串转换为比特
- 字符串转换为字符串和字符串转换为比特
- 提取组件

然后我认为考虑将多少放在核心中以及放在data.uuid或其他地方非常有价值。

我认为最好在设计页面上工作,而不是在这里(此票据只是更大问题的其中一部分)。也许http://dev.clojure.org/pages/viewpage.action?pageId=950382可以提供一些指导。

0
...