2014-11-26 5 views
0

Я пытаюсь написать контейнерную функцию, которая принимает имя функции, ее аргументы и вызывает функцию с дополнительным аргументом.Пропустить функцию как аргумент и ввести другой аргумент

Я уверен, что делаю это неправильно, но вот что у меня есть.

(defn get-dyn [& args] 
     ((first args) "some" (rest args))) 

Итак, первый аргумент является именем функции, и эта функция может иметь любое количество аргументов, так что я думаю, я должен принять необязательный параметр? Мне нужно ввести общий аргумент "some" во все функции, которые я вызываю с помощью этой функции.

так,

(get-dyn str 3 4) 
(get-dyn str 32 "willhelm") 

и т.д .. и я бы ожидать, что это будет эквивалентно делать

(str "some" 3 4) 
(str "some" 32 "wilhelm") 

За исключением, то (rest args) возвращает набор, чтобы он не работает таким образом.

Я пробовал делать это с partial, но не смог его обработать.

Есть ли способ решить эту проблему? или я лучше использую induvidual функции?

ответ

6

Вы можете использовать заявку.

user> (defn get-dyn [f & args] 
     (apply f "some" args)) 
#'user/get-dyn 
user> (get-dyn str 1 2) 
"some12" 
user> (get-dyn str " " 1 " " 2) 
"some 1 2" 
+0

Спасибо, это на самом деле намного более читаемо. – LocustHorde

Смежные вопросы