Clojure - Создать вложенную карту - PullRequest
0 голосов
/ 01 октября 2018

Я хочу создать вложенную карту.

У меня есть следующая реализация функции:

(defn thefunction [something value]

;;"something" is for i.e: (something2 something3) ;it's a seq, could have more values.

;;here I want the code to create a map like this >> {:something2 {:something3 value}}

Я не знаю, как ее реализовать, чтобы получить карту выше.Я новичок в clojure.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

В 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
0 голосов
/ 01 октября 2018

В отличие от многих языков, clojure позволяет использовать литералы коллекции в качестве возвращаемого значения функции без дополнительных затрат, поэтому, например, функция для создания вложенной карты может быть такой простой, как

(defn i-make-a-nested-map []
 {1 {:a {:b 2}}})

и это может использовать аргументы функции где-нибудь там:

(defn i-make-a-nested-map [I'm-a-function-argument]
 {1 {:a {:b I'm-a-function-argument}}})

, поэтому ваш вопрос почти содержит собственный ответ, где вы написали:

(defn thefunction [something value]
    {:something2 {:something3 value}})

Есть полезная функция для манипулирования ключевыми словамиесли вам нужно добавить числа в конец переданного ключевого слова. Это name str и keyword

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