Существует несколько способов сделать то, что вы просите. Это зависит от того, хотите ли вы ленивую последовательность или нет (вам, вероятно, нужна ленивость, если нет побочных эффектов, но вам может потребоваться отсутствие лени, если есть интенсивное вычисление, которое вы хотите кэшировать), или если вы хотите вектор как выход (то же, что и ваш вход). Я постараюсь следовать тому, что вы пытались сделать.
Ваша карта с Eval делает следующее с каждой Fn:
user=> (eval #(str 1))
#<user$eval1332$fn__1333 [email protected]>
Но вы хотите что-то вроде следующего:
user=> (eval (#(str 1)))
"1"
Вы хотите Eval, чтобы иметь сноска применяется, то есть: fn должен быть первым элементом списка. Перечислим его в списке:
user=> (map (comp eval list) [#(str "a" "b") #(str "c" "d") #(str "e" "f")])
("ab" "cd" "ef")
Прохладный. Но вместо eval вы, вероятно, захотите использовать применение:
user=> (apply #(str 1))
; ArityException Wrong number of args (1)
Ups! Это не удалось. apply
не перегружать 0-Arity, но мы можем передать пустой список:
user=> (apply #(str 1)())
"1"
намного лучше. Давайте делать это с картой:
user=> (map #(apply %()) [#(str "a" "b") #(str "c" "d") #(str "e" "f")])
("ab" "cd" "ef")
Или еще лучше, учитывая ваши функции не получают никаких аргументов, вы бы лучше сделать, как было предложено @Magos:
user=> (map #(%) [#(str "a" "b") #(str "c" "d") #(str "e" "f")])
("ab" "cd" "ef")
Спасибо за полный и довольно прогрессивный ответ :) – slhsen