2015-08-03 3 views
0

У меня есть ленивый seq карт, и я пытаюсь удалить карты из этого lazy-seq на основе возвращаемого значения из другой функции. Другая функция вернет true или false в зависимости от того, возвращает ли вызов get значение, равное параметру. Проблема в том, что функция работает неправильно, и я не слишком уверен в этом.clojure: Удаление карт с ленивого seq карт

(defn filter-by-name "Filter by names" [name m] 
     (if (= name (get m :name_of_person)) true false)) 
     ;To be called on each map 

    (defn remove-nonmatching-values "Remove anything not matching" [filter-val all-maps] 
     (map #(remove (filter-by-name filter-val %)) all-maps)) 
     ;trying to call on the lazy seq 
+1

'if' является избыточным, вы можете просто написать' (defn filter-by-name "Фильтровать по именам" [name m] (= name (get m: name_of_person))) ' –

+0

Просто заметил, что, спасибо. – m0butt

+2

Чтобы уменьшить многословие, скажите спасибо, если вы найдете ценный вклад, чтобы поддержать ответ или комментарий, посмотрите на [tour] (https://stackoverflow.com/tour). Этот сайт - все о получении ответы. Это не дискуссионный форум. Там нет chit-chat._ :) –

ответ

1

Вам нужно всего лишь позвонить по номеру remove в последовательности карт.

(defn remove-nonmatching-values 
    "Remove anything not matching" 
    [filter-val all-maps] 
    (remove #(filter-by-name filter-val %) all-maps)) 

Проверить Clojure в remove док

(удалить ПРЕД Coll)

Возвращает ленивую последовательность элементов в Coll, для которых (пункт пред) возвращает ложь. pred должно быть свободным от побочных эффектов. Возвращает преобразователь, если никакая коллекция не предоставляется.

+0

Когда я вызываю это следующим образом: (remove-nonmatching-values ​​"hello" ({: name_of_peson "hello"} {: name_of_peson "bye"})) Он возвращает(). – m0butt

+0

Вы не передаете правильный список, но вызываете функцию, которую вы должны называть следующим образом: '(remove-nonmatching-values" hello "'({: name_of_person" hello "} {: name_of_person" bye "}))' –

+0

Эта функция появляется, чтобы удалить значения * соответствия *, а не несоответствующие. – Thumbnail

0

функция, которая производит тест-функции, необходимые для данного name является

(defn name-matcher [name] 
    (fn [m] (= name (:name_of_person m)))) 

Все, что вам нужно сделать, это фильтровать карты соответственно:

(defn retain-matching-maps [name maps] 
    (filter (name-matcher name) maps)) 

Например,

(retain-matching-maps "hello" (list {:name_of_person "hello"} {:name_of_person "bye"})) 
;({:name_of_person "hello"}) 

Я избавился от

  • комментарии (которые вытекают из имен функций)
  • if (как отмечено Guillermo)
  • в get (ключевые слова - или карты - неявные get функции)
  • двойной отрицательный в имени функции remove-nonmatching-values.

Вы также можете использовать :name вместо :name-of-person. Чем короче вы выражаете свою программу, тем менее вероятно, что вы ошибаетесь.