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