передача функций в качестве аргументов в clojure - PullRequest
6 голосов
/ 20 апреля 2011

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

(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)

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

1 Ответ

14 голосов
/ 20 апреля 2011

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

...