(vec) vs [] векторный литерал - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть две функции, которые я бы вернул, но они не возвращают. Я не могу на всю жизнь понять, почему. Есть идеи?

user=> (defn foo [x] (when (> x 0) (conj (vec (foo (dec x))) x)))
#'user/foo
user=> (defn bar [x] (when (> x 0) (conj [(bar (dec x))] x)))
#'user/bar
user=> (foo 5)
[1 2 3 4 5]
user=> (bar 5)
[[[[[nil 1] 2] 3] 4] 5]

1 Ответ

5 голосов
/ 30 апреля 2019

[xs] создает одноэлементный вектор, содержащий единственный элемент xs. Напротив, (vec xs) не создает одноэлементный вектор, содержащий элемент xs. Вместо этого он создает вектор из n элементов, содержащий каждый элемент в xs отдельно. Функция, которая делает первое - vector: (vector x y z) концептуально такая же, как [x y z]. Сравните с (list x) и (seq x): первый создает одноэлементную последовательность, содержащую свои входные данные, а второй преобразует свои входные данные в последовательность.

Конечно, если вы собираетесь conj на результат vector, вы также можете просто построить 2-элементный вектор напрямую: вместо (conj (vector x) y), напишите [x y].

...