2011-04-20 1 views
5

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

(defn something [fn x] 
    (fn x)) 

(defn cube [x] 
    (* x x x)) 

Когда я вызываю функцию следующим образом это работает:

(something cube 4) 

но это возвращает ошибку:

(something Math/sin 3.14) 

Однако, это работает:

(something #(Math/sin %) 3.14) 

Какое объяснение?

ответ

13

Math.sin не является функцией! Это метод прямо из Java и не понимает различных правил, которые должны выполнять функции Clojure. Если вы завернете его в функцию, то эта функция может действовать как прокси-сервер, передавая аргументы методу «немой» и возвращая результаты в ваш «умный» функционально-ориентированный контекст.

+0

Спасибо, теперь я понимаю. На самом деле я пытался понять макросы, когда возникла эта путаница. Вы можете объяснить мне эту строку? - «Поскольку макросы не оценивают свои аргументы, им могут передаваться имена без кавычек, и можно вызвать вызовы функций с аргументами. Определения функций не могут этого сделать и вместо этого должны быть переданы анонимные функции, которые завершают вызовы функций. ' – Pranav

+0

Мое замешательство заключается в том, что я ясно передал некотируемую функцию «куб» на «что-то», и это работает. – Pranav

+1

Можете ли вы спросить об этом как о правильном SO-вопросе, а не в комментариях? Форматирование здесь довольно тусклое, и я действительно не хочу добавлять «другой ответ» к совершенно несвязанному вопросу. – amalloy

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

  • Нет связанных вопросов^_^