В Clojure for
и map
, а также другие функции и макросы, работающие с последовательностями, генерируют ленивую последовательность вместо вектора.
В REPL ленивые последовательности обычно полностью вычисляютсяпри печати - чтобы его напечатать, достаточно убрать str
в вашей второй до последней строки:
(def sales (vec (for [i (range(count sales))] (assoc (nth sales i) 1 (cust_find (nth (nth sales i) 1))))))
На всякий случай, обратите внимание, что ваш код может быть предварительно проверен / упрощен, чтобы лучше передать смысл,Например, вы просто перебираете последовательность sales
- вам не нужно перебирать индексы, а затем получать каждый элемент, используя nth
:
(def sales
(vec (for [rec sales])
(assoc rec 1 (cust_find (nth rec 1)))))
Во-вторых, вы можете заменить nth ... 1
с second
- это будет легче понять:
(def sales
(vec (for [rec sales])
(assoc rec 1 (cust_find (second rec))))
Или, альтернативно, вы можете просто использовать update
вместо assoc
:
(def sales
(vec (for [rec sales])
(update rec 1 cust_find)))
ИВам действительно нужен внешний vec
здесь?Вы можете делать большую часть того, что намереваетесь, без него:
(def sales
(for [rec sales])
(update rec 1 cust_find))
Кроме того, использование подчеркивания в именах функций Clojure считается плохим стилем : тире (как в cust-find
вместо * 1031)*) легче читать и легче печатать.