2014-11-16 2 views
1

From https://github.com/tonsky/datascriptПочему этот совокупность данных для регистрации данных?

(-> 
(d/q '[:find ?color (max ?amount ?x) (min ?amount ?x) 
     :in [[?color ?x]] ?amount] 
     [[:red 10] [:red 20] [:red 30] [:red 40] [:red 50] 
     [:blue 7] [:blue 8]] 
     4) 
pr-str 
js/console.log) 
;;; ([:red [20 30 40 50] [10 20 30 40]] [:blue [7 8] [7 8]]) 

(-> 
(d/q '[:find ?color (max ?amount ?x) (min ?amount ?x) 
     :in [[?color ?x]] ?amount] 
     [[:red 10] [:red 20] [:red 30] [:red 40] [:red 50] 
     [:blue 7] [:blue 8]] 
     3) 
pr-str 
js/console.log) 
;;; ([:red [30 40 50] [10 20 30]] [:blue [7 8] [7 8]]) 

(-> 
(d/q '[:find ?color (max ?amount ?x) (min ?amount ?x) 
     :in [[?color ?x]] ?amount] 
     [[:red 10] [:red 20] [:red 30] [:red 40] [:red 50] 
     [:blue 7] [:blue 8]] 
     2) 
pr-str 
js/console.log) 
;;; ([:red [40 50] [10 20]] [:blue [7 8] [7 8]]) 

Таким образом, это не вопрос о том, что он делает, это вопрос о том, как (или, по крайней мере, почему) он делает это. max и min - это функции, которые возвращают максимум или минимум своих следующих целых чисел соответственно. Как ?amount получать факторизуемое ограничение количества агрегатов? Почему все это агрегируется? Как выполняется код, который он агрегирует. Я действительно не вижу, как этот код течет, чтобы генерировать результаты, которые он делает.

ответ

2

max и min: overloaded в датетических запросах.

Унарные (min ?x) и (max ?x) функции aggreate для возврата одного номера.

Бинарные (min ?n ?x) и (max ?n ?x) функции aggreate возвращают коллекцию предметов, ограниченных по длине, на ?n.

+0

, чтобы уточнить: (max N coll) - это верхние N значений coll. То же самое для min, это N наименьшее из coll. –