Clojure“如果”从未评估其第三个论点

时间:2009-02-05 14:18:44

标签: clojure

我一直想把这个问题弄清楚一段时间。

(defn is-decimal [astr]
  (if (. astr (indexOf (int \.)))
    (Double/parseDouble astr)
    (Integer/parseInt astr)))

这是我写的功能。 is-decimal要么传递诸如“2.5”或“5”之类的东西,要么传递类似的东西,但它总是使用if的第二个参数,而不是第三个参数。我在REPL中测试了(. astr (indexOf (int \.))),它看起来工作正常,它失败时返回-1,而当它失败时返回1。我相信这可能是问题所在。 -1在Clojure中并不意味着错误。谁能想到解决这个问题的方法呢?

提前致谢。

编辑:谢谢你的帮助。在我写完之后,我有了一个主意。我编写了一个检查1和-1的谓词函数。正是我需要的。醒来后我不应该直接编码:\

3 个答案:

答案 0 :(得分:10)

如果要测试字符串是否包含字符,可以使用正则表达式:

(re-find #"\." astr)

或者:

(some #(= \. %) astr)

或者:

(contains? (into #{} astr) \.)

或者您可以使用clojure.contrib.seq-utils中的includes?来执行此操作。

Clojure已经有一个知道如何区分整数和双精度的读者,所以如果你确定你的字符串中只有数字,你可以使用它。 (但要小心,这会读取任何内容,而不仅仅是数字。这有潜在的危险。如果你的字符串有可能不是数字,请不要使用它。)

注意,Clojure还处理一个整数太大而不适合本地int而没有溢出的情况。如果要解析整数,可能需要查看bigint函数而不是parseInt

user> (class (read-string "2.5"))
java.lang.Double
user> (class (read-string "2"))
java.lang.Integer
user> (class (read-string "2000000000000"))
java.math.BigInteger

如果你的函数是谓词,那么在Clojure中将它命名为decimal?而不是is-decimal是很常见的。您的函数实际上更像是一个数字解析器,所以我个人称之为parse-numberstring-to-number

答案 1 :(得分:6)

未测试:

(if (> 0 (. astr (indexOf (int \.))))

答案 2 :(得分:2)

如果失败则返回-1,然后检查-1,如果

则返回false