9

現在、Clojureを学習しようとしていますが、パラメーターの量が可変の関数を作成したいと思います。この関数は、すべての入力をフィルタリングして、文字列かどうかを確認する必要があります。その場合、文字列型のすべての入力が返されます。

Clojureは私にとって難しいものであり、考え方も異なりますが、私はここで正しい方向に進んでいます。私はそれを解決できないようです。

(defn returnString [& y]
(if (next y)
(filter (fn [x] (= (type x) "java.lang.String"))y)
(recur (next x))))

ありがとう!

4

1 に答える 1

11

string?引数が文字列の場合はtrueを返し、そうでない場合はfalseを返すという関数があります。

=> (string? "hi")
true
=> (string? 100)
false
=> (string? ["a" "b" "c"])
false

したがって、それを念頭に置いて、関数は次のようになります。

(defn return-strings [& vals]
  (filter string? vals))

recurフィルタ関数は値のシーケンス(基本的にはコレクション)を返すため、この場合のカスタム関数での再帰(つまり、の使用)について心配する必要はありません。


文字列を判別するために使用する無名関数は、ほぼ正確です。string?REPLを入力してソースを確認すると、次のように表示さ(source string?)れます。

(fn [x] (instance? String x))

ただし、採用しているアプローチも同様に機能します。与えた文字列値の代わりにStringクラスを指定する必要があります。(java.langそのパッケージはJavaの場合と同じように自動的に含まれるため、省略できます。)

(fn [x] (= (type x) String))
于 2012-05-13T00:36:32.020 に答える