2012-01-11 3 views
3

Я работаю через problems at 4Clojure.Clojure: В чем смысл `и ~ @?

У меня есть рабочий раствор для Tic-Tac-Toe exercise, но я не могу понять Darren's решение:

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

Что такое значение 'и ~ @?

ответ

10

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

Примеры:

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

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

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

Примеры:

(def args [3 4 5 6]) 

`(+ 1 2 [email protected] 7 8) 
=> (clojure.core/+ 1 2 3 4 5 6 7 8) 

`(+ [email protected](range 10)) 
=> (clojure.core/+ 0 1 2 3 4 5 6 7 8 9) 

Более подробно оба этих и связанных с ними операций могут быть найдены в рамках documentation for the Clojure reader.

+0

Мне кажется, что '~ @' только полезный внутри синтаксиса-quote'd seq. Я прав? – Wieczo

+0

Да - я считаю, что ~ @ определяется только в цитированном контексте. Они работают очень много рука об руку. То же самое касается ~. – mikera

+0

Большое спасибо! – Wieczo