2

来自 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考虑限制聚合计数?为什么这些东西总是聚集在一起?代码如何运行以使其聚合。我真的不明白这段代码是如何产生结果的。

4

1 回答 1

3

max并在原子查询min重载。

一元(min ?x)(max ?x)函数聚合以返回单个数字。

二进制(min ?n ?x)(max ?n ?x)函数聚合以返回长度限制为 的项目集合?n

于 2014-11-16T02:38:17.613 回答