Clojure: Что означает `и ~ @? - PullRequest
       0

Clojure: Что означает `и ~ @?

4 голосов
/ 11 января 2012

Я работаю через проблемы в 4Clojure .

У меня есть рабочее решение для упражнения Крестики-нолики , но я не могу понять Решение Даррена :

(fn [b]
  (some (fn [p] (first (keep #(if (apply = p %) p)
                         `(~@b                   ; <- What is that ` and ~@?
                           ~@(apply map list b)  ; 
                           ~(map get b [0 1 2])
                           ~(map get b [2 1 0])))))
     [:x :o]))
 ;b is a two-dimensional vector

Что означает `and ~ @?

Ответы [ 3 ]

11 голосов
/ 11 января 2012

`- это синтаксическая кавычка , которая используется для записи кода в виде данных без его оценки.Обратите внимание, что он достаточно умен, чтобы преобразовать символы, представляющие функции, в правильное пространство имен.

Примеры:

`(+ 1 2)
=> (clojure.core/+ 1 2)    ; a list containing the + function and two arguments

(eval `(+ 1 2))
=> 3                       ; the result of evaluating the list

~ @ - оператор объединения без кавычек ,позволит вам расширить список элементов в некоторых указанных данных / коде.

Примеры:

(def args [3 4 5 6])

`(+ 1 2 ~@args 7 8)
=> (clojure.core/+ 1 2 3 4 5 6 7 8)

`(+ ~@(range 10))
=> (clojure.core/+ 0 1 2 3 4 5 6 7 8 9)

Более подробную информацию об этих и связанных с ними операциях можно найти как часть документация для считывателя Clojure .

2 голосов
/ 16 августа 2012

Несмотря на то, что это Common Lisp, а не Clojure, в главе о макросах в Практическом Common Lisp есть несколько хороших примеров, которые хорошо переводятся:

http://www.gigamonkeys.com/book/macros-defining-your-own.html

2 голосов
/ 11 января 2012

См. Маркированный раздел «Синтаксическая цитата» и примеры в документации на устройстве чтения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...