文字列をソースとして使用して、文字のリストを作成しようとしています。私は少しグーグルをして何も思いつかなかったので、私は自分が望むことをする関数を書きました:
(defn list-from-string [char-string]
(loop [source char-string result ()]
(def result-char (string/take 1 source))
(cond
(empty? source) result
:else (recur (string/drop 1 source) (conj result result-char)))))
しかし、これを見ると、私はトリックを逃しているに違いないと感じます。
seq関数を使用してこれを行うことができます:
user=> (seq "aaa")
(\a \a \a)
数値の場合、次のような「ダム」ソリューションを使用できます。
user=> (map (fn [^Character c] (Character/digit c 10)) (str 12345))
(1 2 3 4 5)
P.S. clojureの文字列は 'seq'可能であるため、任意のシーケンス処理関数(map、for、...)のソースとして使用できます。
入力が文字になることがわかっている場合は、
user=> (seq "abc")
(\a \b \c)
数字については、これを試してください
user=> (map #(Character/getNumericValue %) "123")
(1 2 3)
編集:おっと、異なる文字のリストが必要だと思いました。そのためには、コア機能「周波数」を使用します。
clojure.core/frequencies
([coll])
Returns a map from distinct items in coll to the number of times they appear.
例:
user=> (frequencies "lazybrownfox")
{\a 1, \b 1, \f 1, \l 1, \n 1, \o 2, \r 1, \w 1, \x 1, \y 1, \z 1}
次に、キーを取得して文字列に変換する(または変換しない)だけです。
user=> (apply str (keys (frequencies "lazybrownfox")))
"abflnorwxyz"
(apply str (set "lazybrownfox")) => "abflnorwxyz"