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

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

+27
Clojure
已关闭

理由

根据我的个人经验,以及观察 Slack 中的初学者频道,新手的极端常见陷阱是想知道如何将字符串解析为整型。

这会在多个方面出错

  • 人们发现 int 函数,其文档字符串为 强制转换为整型,传递字符串时会抛出异常。
  • 有人建议使用 Integer/parseInt 来执行这项任务,但它不能用作 (map Integer/parseInt coll-of-strings),这是令人惊讶的,因为这通常是他们对 Java 集成的第一次体验。
  • 有人建议使用 ,这符合预期,但其语法对于 Clojure 的前 10 分钟来说可能有点多。
  • 有时人们建议使用 ,这在 Java 11 中已被弃用。
  • 人们在 ClojureScript 中执行相同的操作,并必须选择不同的互操作方式来完成此操作。

建议 1

考虑在 Clojure 中添加一个 parse-* 函数家族,这些函数是在 Java 互操作上的薄包装。附录中可能有这样的列表。

建议 2

考虑将 clojure.lang.LispReader.matchNumber 暴露为 parse-number

然后人们可以使用各种强制函数来获取他们需要的精度。这可能更适合这张票据的理由,即使非常常见的“玩具程序”操作对初学者来说更加平滑,并且与读者的行为相匹配将是最不令人惊讶的事情。

对性能敏感的人应该了解 JVM 上装箱算术的复杂性。这也是一个愉悦的平台无关选项,CLJS 可以公开 match-number

问题/替代方案

  • 函数应该返回原始值还是装箱值?
  • 如何处理如 "0xff" 这样的字符串?parseFoo 函数家族拒绝这些,但 0xff 可以通过 Clojure 读取器读取。
  • 另一方面,decode 函数家族处理一些前缀,但它们返回装箱值。但它们还接受像 #10 这样的数字,这是一个无效的 Clojure 文字。

附录

以下是(截至 JVM 8)可能完整的原始返回函数列表:

name 	args 	ret-value
parse-int 	s 	int
parse-int 	s, radix 	int
parse-uint 	s 	int
parse-uint 	s, radix 	int
parse-long 	s 	long
parse-long 	s, radix 	long
parse-ulong 	s 	long
parse-ulong 	s, radix 	long
parse-short 	s 	short
parse-short 	s, radix 	short
parse-byte 	s 	byte
parse-byte 	s, radix 	byte
parse-float 	s 	float
parse-double 	s 	double

无符号功能是在 Java 8 中添加的,因此在较新版本的 Clojure 中使用应该是安全的。较新的 JVM 版本增加了对解析 CharSequence 部分的支持。

以以下备注结束: 在 1.11.0-alpha3 中添加了 parse-long、parse-double、parse-boolean、parse-uuid

2 个回答

+2
by

提醒一下,我认为我们不太可能添加解析器以匹配所有的 Java 类型。但我确实认为有一些子集是匹配读取器有用的。

  • 固定精度的整数 - 总是返回一个 Long
  • 固定精度的浮点数(总是返回一个 Double)
  • 整数 - 匹配读取器 - 根据需要返回 Long/BigInteger
  • 浮点数 - 匹配读取器 - 根据需要返回 Double/BigDecimal
  • 数字 - 在解析所有数字格式时匹配读取器

但需要更多的评估。

by
作为更合理的解释,初学者经常遇到 `read-string` 并使用它。当然可以完成任务,但是存在许多对于只希望将 "10" 转换成 10 的初学者来说不太明显的问题。
by
是的,绝对是
这在很大程度上,是Java互操作性中最常见的方法,也是人们在解决Advent of Code等练习时最常遇到的第一个问题。
"parse-*" 命名可能经常出现在程序中。与 clojure.core 的冲突并非致命,但会造成不便。这些新函数应该放在 clojure.string 命名空间中,以避免冲突吗?或许可以创建一个新的命名空间?
所有名称/位置待定。
作为一个现在学习Clojure的新手,这确实会让人感到困惑。如果想知道是否会在以后版本中对此进行规划。
这些函数是在Clojure 1.11版中添加的 - parse-long、parse-double、parse-boolean 和 parse-uuid。
0
by
参考: https://clojure.atlassian.net/browse/CLJ-2451(由 alex+import 报告)
...