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

欢迎!请参考关于页面了解更多有关此功能的信息。

+1

编辑

ClojureScript会将像{:person/weight 200.0}这样的数值类型,以JavaScript的唯一数值类型Number来表示。当这种记录用transit序列化时,transit会将其视为Number: 200并以整数形式打包,然后其他平台(例如JVM)会将该值解包为整数,而不是浮点数,如果Datomic这样的系统在遇到意外的类型时不会崩溃,除非我根据一个规定:person/weight 是:db.type/float 的模式预先处理这些值。

这是transit的设计缺陷吗?transit应该改变以允许我指定类型,并/或通过与模式提供程序的(spec)集成来选择正确的类型吗?

1 个答案

+1

我只是想重申您的问题,我认为您是在问,transit-cljs(实际上是transit-js)是否有一种方法可以强制将JavaScript数字200.0编码为transit的“浮点十进制”基础类型?(这并不是真正的transit-format问题,因为transit本身具有表示固定和任意精度整数和浮点数的能力。所以,这实际上是特定语言的编码器问题。)

我认为答案是否定的(但我并不是这个领域的js专家)。transit-js/transit-cljs只支持编码transit基基数类型i(整数,有符号64位)或f(任意精度小数)。我不知道,但我猜想这可能是因为难以判断一个数字是否可以以浮点小数形式表示。

可能允许你强制这样做,但我认为最好的讨论地点可能是https://github.com/cognitect/transit-js#https://github.com/cognitect/transit-cljs#

by
我在哲学层面上质疑,Transit如果不能与像spec或Datomic这样的模式提供程序集成,就绝对无法正确完成其工作[跨平台值交换]?
by
Transit的整个点在于通过提供编码(和扩展类型)的手段,成为无模式的值传输方式。按照其逻辑,“Transit以语义类型处理元素,但它不是一个类型系统,也没有模式。” https://github.com/cognitect/transit-format#rationale Transit能够传输浮点值吗?是的,它有一个基类型用于此。

有关transit类型按语言编码或解码的问题是对那些特定语言编码器或解码器的问题(因为语言特定的能力各不相同)。transit-cljs/transit-js有方法将JavaScript数字编码为浮点小数吗?目前没有。

这些问题与模式或Datomic毫无关系。
by
经过思考,我认为Transit声称的无模式目标是关于解码和解释的。你不需要模式来读取它。然而,在这种特定情况下,模式对帮助平台侧的关键复杂性至关重要。我认为
by
在这种情况下,您在反序列化为JS时丢失了信息,因为它的类型系统无法区分。因此,这个数字现在实际上是一个整数。

(Number/isInteger 200.0)
;> true

因此从序列化的角度来看,这似乎是正确的。

看似发生的问题是您的数据库具有严格的模式。因此,我建议在那一级别简单地实现强制类型转换。
...