Макросы и функции в Clojure - PullRequest
       10

Макросы и функции в Clojure

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

Я прочитал следующую строку в этом уроке Clojure - http://java.ociweb.com/mark/clojure/article.html#Macros

'Поскольку макросы не оценивают свои аргументы, им могут передаваться имена без кавычек и вызовы функций с аргументамиможет быть построен.Определения функций не могут сделать это, и вместо этого должны быть переданы анонимные функции, которые обертывают вызовы функций. '

Если это правильно, то почему это работает, поскольку куб функции не является анонимным -

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

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

(something cube 4)

Ответы [ 2 ]

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

Вы правы, эта цитата, похоже, не верна.Я думаю , что он пытается сказать, что вы не можете передать нечто, похожее на вызов функции, без кавычек:

(some-function (bla 1 2 3))

В этом случае (bla 1 2 3) будетбудет оцениваться как вызов функции, и возвращаемое значение будет передано некоторой функции.

(some-macro (bla 1 2 3))

В случае макроса передается список (bla 1 2 3),который затем может быть использован для создания нового вызова функции путем вставки аргументов или выполнения чего-либо еще.

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

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

определяет макрос, код расширяется, так как вам нужна анонимная функция: (def something (fn [fn x] (fn x))).Я думаю, что он имеет в виду.

...