Clojure рекурсивная функция - PullRequest
       9

Clojure рекурсивная функция

2 голосов
/ 17 октября 2011

Как новичок Clojure, я обеспокоен этой маленькой проблемой:

Я бы хотел пройти через последовательность и выполнить split, а затем str (конкатенацию) над элементами последовательности.

Вот моя последовательность:

(("2.660.784") ("2.944.552") ("44.858.797"))

То, что я хочу получить, выглядит примерно так:

("2660784" "2944552" "44858797")

И это моя попытка создать рекурсивное решение для моей проблемы:

(defn old 
      [squence]
      (let [size (count squence)]
        (loop [counter 1]
          (if (<= counter size)
            (apply str (clojure.string/split 
                   (first (first squence))
                   #"\b\.\b"
                   ))
            (old (rest squence)))
          )))

И, конечно, это не решение, поскольку оно применяется split и str только к одному элементу, но я хотел бы повторить это для каждого элемента в squence. squence является продуктом какой-то другой функции в моем проекте.

Я определенно что-то упускаю, поэтому, пожалуйста, помогите мне с этим ...

Ответы [ 4 ]

6 голосов
/ 17 октября 2011

Самый простой способ написать это с replace, а не split / str.И после того, как вы написали функцию, которая может выполнить это преобразование для одной строки, вы можете использовать map или for, чтобы сделать это для последовательности строк.Здесь мне пришлось немного деструктурировать, поскольку по какой-то причине каждый элемент вашей последовательности сам по себе является другой последовательностью;Я только что вытащил первый элемент.

(for [[s] '(("2.660.784") ("2.944.552") ("44.858.797"))]
  (clojure.string/replace s #"\b\.\b" ""))
3 голосов
/ 17 октября 2011
user=> (defn reject-char-from-string
  [ch sequence]
  (map #(apply str (replace {ch nil} (first %))) sequence))
#'user/reject-char-from-string
user=> (reject-char-from-string \. '(("2.660.784") ("2.944.552") ("44.858.797"))
)
("2660784" "2944552" "44858797")
1 голос
/ 17 октября 2011

Это так просто?

(def data '(("2.660.784") ("2.944.552") ("44.858.797")))
(require '[clojure.string :as string])
(map #(string/replace (first %1) "." "") data)
;=> ("2660784" "2944552" "44858797")
1 голос
/ 17 октября 2011

пробовал это?

=> (flatten '(("2.660.784") ("2.944.552") ("44.858.797")))
("2.660.784" "2.944.552" "44.858.797")
...