В clojure.core есть функция assoc-in
, которую вы можете использовать для этого.assoc-in
принимает ассоциативную структуру данных (например, карту, вектор), последовательность ключей и значение, которое нужно связать на конце вложенного пути.
В вашем случае естьнет предварительно существующей структуры, с которой можно связываться, но это нормально, потому что assoc-in
использует assoc
внутренне, что создаст карту, если первый аргумент равен nil:
(assoc nil :foo 1)
=> {:foo 1}
Таким образом, вы можете определить свою функцию в терминахassoc-in
с nil в качестве первого аргумента:
(defn the-function [something value]
(assoc-in nil something value))
И, например, если ваша последовательность something
состоит из символов:
(the-function '(something2 something3) 'value)
=> {something2 {something3 value}}
(the-function (map str (range 4)) :foo)
=> {"0" {"1" {"2" {"3" :foo}}}}
Я хочу получить доступ кзначение с использованием (get-in theMap [:something2 :something3])
, но оно возвращает nil
Обычно вы увидите, что литералы карты Clojure используют ключи ключевое слово , хотя многие другие типы также будут работать нормально, и их можно смешивать:
(the-function [:foo "bar" 'baz] \z)
=> {:foo {"bar" {baz \z}}}
Вы можете преобразовать свою последовательность ввода в ключевые слова, прежде чем вызывать свою функцию (или внутри нее, если вы хотите применять ключевые слова для всех вызывающих абонентов).
(the-function (map keyword '(something2 something3)) 'value)
=> {:something2 {:something3 value}}
(get-in *1 (map keyword '(something2 something3)))
=> value