在Clojure中用变量检查字符串长度

时间:2017-10-10 20:45:24

标签: clojure

我想要一个用Clojure编写的函数来检查我给定的String是否大于给定的数字,如果是,我的函数说明为true,否则表示为false。 现在我提出了以下代码,但它给出了以下错误: ClassCastException java.lang.Long无法强制转换为clojure.lang.IFn用户/检查器(form-init1692807253513002836.clj:1)

我提出的代码是:

(defn checker [str, num] 
  (cond 
    (> (count str) num) "True"
    :else "False"
  )
) 
(checker "test" 6)

有人可以解释为什么count str被认为是Long和/或如何修复这个函数?

2 个答案:

答案 0 :(得分:2)

你可能想通过考虑一些Clojure来“修复”你的功能 适用于您的代码段的习语:

  • 内置布尔值;无需使用"True" / "False"字符串 (除非你只是将它们作为占位符示例使用 别的东西)

  • >以来,不需要明确回归布尔值 已经返回一个布尔值

  • 你测量的是“长度”而不是“大”,所以使用a 描述性功能名称; strlen可能很常见

  • 由于布尔返回值,您可以使用?

  • 结束
  • 可能会将str作为var name

考虑到这些,您的功能简化为:

(defn strlen-exceeds? [s n]
  (> (count s) n))

(现在它足够短,你可能甚至不需要它成为一个 显性功能。)

答案 1 :(得分:0)

我认为您的代码应该有效,但对于这种情况,请不要使用cond使用if

(defn checker [str, num] 
  (if (> (count str) num) 
     "True"
    "False")) 


> (checker "a" 1)
"False"
> (checker "a" 2)
"False"
> (checker "ab" 2)
"False"
> (checker "ab" 2)