Вот простая версия, которая работает:
(defn lookup
[k lol]
(let [the-map (into {}
(for [lst lol]
{(first lst) (second lst) } ))
result (get the-map k)]
result ) )
(lookup (quote b) (quote (((a b) 1) (c 2) (b 3)))) => 3
(lookup (quote [a b]) (quote (((a b) 1) (c 2) (b 3)))) => 1
(lookup (quote d) (quote (((a b) 1) (c 2) (b 3)))) => nil
Однако ваш код будет проще, если вы замените все списки в кавычках, такие как '(1 2 3)
, на векторы, такие как [1 2 3]
(тогда не нужно использовать начальную кавычку), и замените все символы в кавычках, такие как 'a
, на ключевые слова. как :a
(также не нужно заключать символы в кавычки.
Выполнение этих изменений и добавление модульных тестов выглядит так:
(ns tst.demo.core
(:use tupelo.core demo.core tupelo.test) )
(defn lookup
[k lol]
(get (into {} lol) k))
(dotest
(is= 3 (lookup :b [[[:a :b] 1] [:c 2] [:b 3]]))
(is= 1 (lookup [:a :b] [[[:a :b] 1] [:c 2] [:b 3]]))
(is= nil (lookup :d [[[:a :b] 1] [:c 2] [:b 3]])))
P.S. Пожалуйста, см. Brave Clojure для более подробной информации.
Обновление:
Вы не можете использовать обычную функцию с этим синтаксисом:
(look-up b '(((a b) 1) (c 2) (b 3)))
, поскольку b
является символом и должно быть переменной , а не частью данных . Ваш выбор:
- Преобразуйте символ
b
в ключевое слово :b
, как я предложил
- Всегда цитируйте символ как
'b
(болезненный и подверженный ошибкам)
- Напишите макрос (который автоматически «заключает в кавычки» все его аргументы), и пусть макрос вызывает первую версию функции
lookup
(много работы для небольшой выгоды).
Таким образом, я предложил пункт (1) в качестве предпочтительного решения.