Рекурсивно мутирующие значения в карте карт с помощью Spectre - PullRequest
1 голос
/ 05 апреля 2020

полный Clojure newb ie здесь. Это простой вопрос, но я, похоже, не могу его получить:

Учитывая, что у меня есть вложенная hasmap неизвестной глубины, как я могу использовать функцию transform () Spectre для изменения значений структуры данных? Я предполагаю, что здесь требуется рекурсивный путь, но я не могу заставить его работать. рабочий пример - это то, что мне нужно, и, к сожалению, его нет в документах.

(есть пример для set-val на рекурсивной карте, но я не не знаю, как преобразовать это в прецедент преобразования)

РЕДАКТИРОВАТЬ: были запрошены дополнительные подробности, вот они: Меня интересует форма преобразования, которая может изменять все значения вложенных карт - любой глубины). например, это преобразование сможет увеличивать все значения в следующих картах (и любой другой вложенной карте):

{:a 1 :b {:c 2 :d {:e 3}}} 
AND
{:a 1 :b {:c 2}}
AND
{:a 1}

строка кода, в которой я заинтересован, может выглядеть так:

(transform <missing selector here> inc data)

Ответы [ 2 ]

2 голосов
/ 05 апреля 2020

Используя связанный пример :

(def MAP-NODES
   (recursive-path [] p
     (if-path map?
       (continue-then-stay MAP-VALS p))))
(transform [MAP-NODES MAP-VALS number?] inc data)
0 голосов
/ 05 апреля 2020

Обязательно всегда изучайте Clojure CheatSheet . Для чего-то такого простого, возможно, будет проще всего использовать clojure.walk/postwalk

(ns tst.demo.core
  (:use tupelo.core tupelo.test)
  (:require [clojure.walk :as walk]))

(dotest
  (let [data   {:a 1 :b {:c 2 :d {:e 3}}}
        result (walk/postwalk (fn [item]
                                (if (int? item)
                                  (inc item)
                                  item))
                 data)]
    (is= result {:a 2, :b {:c 3, :d {:e 4}}})))

. Для более сложных задач вас может заинтересовать функция walk-with-parent , которая позволяет проверить все элементы на пути от узла root до текущего узла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...