2024 Clojure状况调查问卷中分享您的想法!

欢迎!请参见关于页面以了解更多有关本站如何工作的信息。

+27
Clojure
已关闭

理由

根据我自己的经验和观察Slack中的新手频道,对于初学者来说最常见的一个错误是他们想知道如何将字符串解析为整数。

这出错了有多种方式

  • 人们发现了int函数,其文档字符串为转换为整数 —— 当传入一个字符串时抛出异常。
  • 有人建议使用Integer/parseInt,它可以完成这项工作,但不能用作(map Integer/parseInt coll-of-strings) —— 这是令人惊讶的,因为他们是第一次体验Java互操作。
  • 有人建议使用#(Integer/parseInt %),它执行预期的操作,但其语法对于您的Clojure最初的10分钟来说可能有点多。
  • 有时人们建议使用#(Integer. %),这在Java 11中已弃用。
  • 人们在ClojureScript中也经历了相同的流程,并必须选择不同的互操作方式来完成此操作。

提议1

考虑在Clojure中添加一个parse-*函数族,它是Java互操作的薄包装。请参见附录中可能的列表。

提议2

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

人们可以使用各种转换函数来获取所需精度。这可能更适合这个条目的理性,即使非常常见的“玩具程序”操作对初学者来说更加顺畅,并且与Reader的行为匹配将是做事最不会令人惊讶的事情。

对于性能比较敏感的人应该已经了解了JVM上装箱算术的复杂之处。这也非常平台无关,CLJS可以暴露match-number

问题/替代方案

  • 函数应该返回原始值还是装箱值?
  • 对于像〈code>"0xff"〈/code>这样的字符串应该怎么处理?parseFoo函数族的函数拒绝这些,但是〈code>0xff〈/code>可以被Clojure读取器读取。
  • 另一方面,《code>decode〈/code>函数族处理某些前缀,但它们返回装箱值。但它们也接受诸如〈code>#10〈/code>这样的无效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版本添加了对解析CharacterSequence部分的支援。

已关闭,备注: 在1.11.0-alpha3中添加了parse-long,parse-double,parse-boolean,parse-uuid

2 个答案

+2

FYI,我认为我们不太可能为匹配所有Java类型添加解析器。但我确实认为拥有这些类型的一个子集以匹配读取器会有用。

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

但需要更多的评估。

作为更多推理,初学者经常会遇到`read-string`并为它使用。当然可以完成任务,但会有很多问题,这些问题对于一个只想把“10”变成10的初学者来说并不明显。
是的,绝对是的
这是Java互操作性人员最常做的事情,也是人们在面对代码或某些练习时最早遇到的事情之一。
"parse-*"这类名称可能出现在程序中相当频繁。与clojure.core的一致性不是问题,但会造成不必要的麻烦。是否将新的函数放入clojure.string名称空间以避免冲突?也许是新的名称空间?
所有名称/位置待定。
作为一个现在正在学习Clojure的新手,这确实是一个让人困惑的来源。如果这些计划在后来的版本中进行,将是个好消息。
这些函数是从Clojure 1.11版本中添加的:parse-long、parse-double、parse-boolean 和 parse-uuid。
0
参考: https://clojure.atlassian.net/browse/CLJ-2451 (由 alex+import 报告)
...