Как использовать функцию карты на векторе карт в clojure - PullRequest
2 голосов
/ 12 июня 2019

как дела? Я совершенно новичок в Clojure, и я столкнулся с проблемой, которую, как я догадался, было бы легко решить, но я не могу понять, как это можно понять. У меня есть метод, который генерирует вектор координат в квадратной доске. Результатом выполнения такой функции является что-то вроде

 [{:x 1, :y 0} {:x 0, :y 1} {:x 2, y:3} {:x 3, :y 4}]

После запуска этой функции мне нужно применить другую функцию к приведенному выше результату. Так как я буду отображать функцию на коллекцию, я решил использовать функцию map, чтобы она подходила. Поэтому я написал следующий метод:

(defn attack [x y]  (map (fn [coord] (println (get coord :x))) [{:x 1, :y 0} {:x 0, :y 1}]))

(я также пробовал приведенный выше пример с get-in вместо get, но безрезультатно)

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

clojure myscript.clj

Однако из этого ничего не выходит, и не имеет значения, возвращаю ли я значение из функции fn или нет. Например, это

(defn attack [x y]  (map (fn [coord] coord) [{:x 1, :y 0} {:x 0, :y 1}]))

также ничего не возвращает. Кто-нибудь знает, как я мог бы по крайней мере получить доступ к значениям внутри вектора в моей функции fn?

Наконец, влияет ли это на то, что мой вектор генерируется при вызове другой функции? Например,

(defn attack [x y]  (map (fn [coord] coord) (get-attack-coordinates x y)))

это будет проблемой? Наверное, нет, но я подумал, что это хорошая идея - спросить на всякий случай. Спасибо всем за чтение:)

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

map возвращает в этом случае

(map (fn [coord] coord) [{:x 1, :y 0} {:x 0, :y 1}])
;; => ({:x 1, :y 0} {:x 0, :y 1})

Обратите внимание, что в этом случае:

(map (fn [coord] (println (get coord :x))) [{:x 1, :y 0} {:x 0, :y 1}])

Сначала будет напечатано 1, а затем 0, а затем вернется

(nil nil)

, поскольку println возвращает nil.

Кроме того, если вы хотите получить доступ к x и y, вы также можете использовать destruuring :

(map (fn [{:keys [x y]}] [x y]) [{:x 1, :y 0} {:x 0, :y 1}])

Обратите внимание, что я попробовал эти вещи в REPL:

The REPL

2 голосов
/ 12 июня 2019

(map f xs) всегда возвращает что-то. Это невозможно не Если вы думаете, что это не так, значит что-то не так с вашим измерением, а не с вашим map вызовом. Включите больше кода о структуре вашей программы, а не только этот фрагмент.

...