目前我正在尝试学习 Clojure,我想编写一个具有可变数量参数的函数。这个函数应该过滤每个输入来检查它是否是一个字符串。如果是这样,则应返回字符串类型的每个输入。
Clojure 对我来说很难,而且思维方式不同,但我在这里的方向是否正确.. 我似乎无法解决它:
(defn returnString [& y]
(if (next y)
(filter (fn [x] (= (type x) "java.lang.String"))y)
(recur (next x))))
谢谢!
有一个函数调用string?
,如果参数是字符串则返回 true,否则返回 false。
=> (string? "hi")
true
=> (string? 100)
false
=> (string? ["a" "b" "c"])
false
因此,考虑到这一点,您的函数将如下所示:
(defn return-strings [& vals]
(filter string? vals))
filter 函数将返回一个值序列(本质上是一个集合),因此在这种情况下,您无需担心自定义函数中的递归(即使用recur
)。
您用来确定什么是字符串的匿名函数非常接近正确。如果您string?
通过输入(source string?)
REPL 查看源代码,您会看到:
(fn [x] (instance? String x))
虽然,您采用的方法也可以。您只需要指定 String 类而不是您提供的字符串值。(请注意,您可以省略,java.lang
因为该包会像在 Java 中一样自动包含在内。)
(fn [x] (= (type x) String))