-
-
Save mmower/d20bdf176a993476109d to your computer and use it in GitHub Desktop.
(defn ->pred | |
[[op component-slot value]] | |
(let [[component slot] (str/split (name component-slot) #"\.")] | |
{(keyword component) #((eval op) ((keyword slot) %1) value)})) | |
(defmacro search | |
[world & criteria] | |
(let [c1# (map ->pred criteria) | |
c2# (flatten c1#) | |
_ (print (str c2#))] | |
`(find-entities ~world ~c2#))) | |
user=> (search world (= pos.x 34)) | |
IllegalArgumentException No matching ctor found for class mces.core$__GT_pred$fn__4734 clojure.lang.Reflector.invokeConstructor (Reflector.java:163) | |
clojure.lang.LazySeq@4bd50e85user=> |
(find-entities world [{:pos #(= (get %1 :x) 19)}])
=> #{#uuid "5306c4de-5e61-4484-9f32-db204c622293"}
user=> (println (disassemble (:pos (->pred '[= pos.x 2])))
#_=> )
// Compiled from form-init956110948909163083.clj (version 1.5 : 49.0, super bit)
public final class user$__GT_pred$fn__4682 extends clojure.lang.AFunction {
// Field descriptor #7 Lclojure/lang/Var;
public static final clojure.lang.Var const__0;
// Field descriptor #7 Lclojure/lang/Var;
public static final clojure.lang.Var const__1;
// Field descriptor #30 Ljava/lang/Object;
java.lang.Object slot;
// Field descriptor #30 Ljava/lang/Object;
java.lang.Object value;
// Field descriptor #30 Ljava/lang/Object;
java.lang.Object op;
// Method descriptor #10 ()V
// Stack: 2, Locals: 0
public static {};
0 ldc <String "clojure.core"> [12]
2 ldc <String "eval"> [14]
4 invokestatic clojure.lang.RT.var(java.lang.String, java.lang.String) : clojure.lang.Var [20]
7 checkcast clojure.lang.Var [22]
10 putstatic user$__GT_pred$fn__4682.const__0 : clojure.lang.Var [24]
13 ldc <String "clojure.core"> [12]
15 ldc <String "keyword"> [26]
17 invokestatic clojure.lang.RT.var(java.lang.String, java.lang.String) : clojure.lang.Var [20]
20 checkcast clojure.lang.Var [22]
23 putstatic user$__GT_pred$fn__4682.const__1 : clojure.lang.Var [28]
26 return
Line numbers:
[pc: 0, line: 3]
// Method descriptor #34 (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
// Stack: 2, Locals: 4
public user$__GT_pred$fn__4682(java.lang.Object arg0, java.lang.Object arg1, java.lang.Object arg2);
0 aload_0
1 invokespecial clojure.lang.AFunction() [36]
4 aload_0
5 aload_1
6 putfield user$__GT_pred$fn__4682.slot : java.lang.Object [38]
9 aload_0
10 aload_2
11 putfield user$__GT_pred$fn__4682.value : java.lang.Object [40]
14 aload_0
15 aload_3
16 putfield user$__GT_pred$fn__4682.op : java.lang.Object [42]
19 return
Line numbers:
[pc: 0, line: 3]
// Method descriptor #44 (Ljava/lang/Object;)Ljava/lang/Object;
// Stack: 4, Locals: 2
public java.lang.Object invoke(java.lang.Object p1__4678_SHARP_);
0 getstatic user$__GT_pred$fn__4682.const__0 : clojure.lang.Var [24]
3 invokevirtual clojure.lang.Var.getRawRoot() : java.lang.Object [48]
6 checkcast clojure.lang.IFn [50]
9 aload_0 [this]
10 getfield user$__GT_pred$fn__4682.op : java.lang.Object [42]
13 invokeinterface clojure.lang.IFn.invoke(java.lang.Object) : java.lang.Object [52] [nargs: 2]
18 checkcast clojure.lang.IFn [50]
21 getstatic user$__GT_pred$fn__4682.const__1 : clojure.lang.Var [28]
24 invokevirtual clojure.lang.Var.getRawRoot() : java.lang.Object [48]
27 checkcast clojure.lang.IFn [50]
30 aload_0 [this]
31 getfield user$GT_pred$fn__4682.slot : java.lang.Object [38]
34 invokeinterface clojure.lang.IFn.invoke(java.lang.Object) : java.lang.Object [52] [nargs: 2]
39 checkcast clojure.lang.IFn [50]
42 aload_1 [p1__4678_SHARP]
43 aconst_null
44 astore_1 [p1__4678_SHARP]
45 invokeinterface clojure.lang.IFn.invoke(java.lang.Object) : java.lang.Object [52] [nargs: 2]
50 aload_0 [this]
51 getfield user$_GT_pred$fn__4682.value : java.lang.Object [40]
54 invokeinterface clojure.lang.IFn.invoke(java.lang.Object, java.lang.Object) : java.lang.Object [55] [nargs: 3]
59 areturn
Line numbers:
[pc: 0, line: 3]
[pc: 0, line: 4]
[pc: 0, line: 4]
[pc: 21, line: 4]
[pc: 21, line: 4]
Local variable table:
[pc: 0, pc: 59] local: this index: 0 type: java.lang.Object
[pc: 0, pc: 59] local: p1__4678_SHARP index: 1 type: java.lang.Object
}
user=> (println (disassemble (:pos (->pred '[= pos.x 2])))
#_=> )
// Compiled from form-init956110948909163083.clj (version 1.5 : 49.0, super bit)
public final class user$__GT_pred$fn__4682 extends clojure.lang.AFunction {
// Field descriptor #7 Lclojure/lang/Var;
public static final clojure.lang.Var const__0;
// Field descriptor #7 Lclojure/lang/Var;
public static final clojure.lang.Var const__1;
// Field descriptor #30 Ljava/lang/Object;
java.lang.Object slot;
// Field descriptor #30 Ljava/lang/Object;
java.lang.Object value;
// Field descriptor #30 Ljava/lang/Object;
java.lang.Object op;
// Method descriptor #10 ()V
// Stack: 2, Locals: 0
public static {};
0 ldc <String "clojure.core"> [12]
2 ldc <String "eval"> [14]
4 invokestatic clojure.lang.RT.var(java.lang.String, java.lang.String) : clojure.lang.Var [20]
7 checkcast clojure.lang.Var [22]
10 putstatic user$__GT_pred$fn__4682.const__0 : clojure.lang.Var [24]
13 ldc <String "clojure.core"> [12]
15 ldc <String "keyword"> [26]
17 invokestatic clojure.lang.RT.var(java.lang.String, java.lang.String) : clojure.lang.Var [20]
20 checkcast clojure.lang.Var [22]
23 putstatic user$__GT_pred$fn__4682.const__1 : clojure.lang.Var [28]
26 return
Line numbers:
[pc: 0, line: 3]
// Method descriptor #34 (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
// Stack: 2, Locals: 4
public user$__GT_pred$fn__4682(java.lang.Object arg0, java.lang.Object arg1, java.lang.Object arg2);
0 aload_0
1 invokespecial clojure.lang.AFunction() [36]
4 aload_0
5 aload_1
6 putfield user$__GT_pred$fn__4682.slot : java.lang.Object [38]
9 aload_0
10 aload_2
11 putfield user$__GT_pred$fn__4682.value : java.lang.Object [40]
14 aload_0
15 aload_3
16 putfield user$__GT_pred$fn__4682.op : java.lang.Object [42]
19 return
Line numbers:
[pc: 0, line: 3]
// Method descriptor #44 (Ljava/lang/Object;)Ljava/lang/Object;
// Stack: 4, Locals: 2
public java.lang.Object invoke(java.lang.Object p1__4678_SHARP_);
0 getstatic user$__GT_pred$fn__4682.const__0 : clojure.lang.Var [24]
3 invokevirtual clojure.lang.Var.getRawRoot() : java.lang.Object [48]
6 checkcast clojure.lang.IFn [50]
9 aload_0 [this]
10 getfield user$__GT_pred$fn__4682.op : java.lang.Object [42]
13 invokeinterface clojure.lang.IFn.invoke(java.lang.Object) : java.lang.Object [52] [nargs: 2]
18 checkcast clojure.lang.IFn [50]
21 getstatic user$__GT_pred$fn__4682.const__1 : clojure.lang.Var [28]
24 invokevirtual clojure.lang.Var.getRawRoot() : java.lang.Object [48]
27 checkcast clojure.lang.IFn [50]
30 aload_0 [this]
31 getfield user$GT_pred$fn__4682.slot : java.lang.Object [38]
34 invokeinterface clojure.lang.IFn.invoke(java.lang.Object) : java.lang.Object [52] [nargs: 2]
39 checkcast clojure.lang.IFn [50]
42 aload_1 [p1__4678_SHARP]
43 aconst_null
44 astore_1 [p1__4678_SHARP]
45 invokeinterface clojure.lang.IFn.invoke(java.lang.Object) : java.lang.Object [52] [nargs: 2]
50 aload_0 [this]
51 getfield user$_GT_pred$fn__4682.value : java.lang.Object [40]
54 invokeinterface clojure.lang.IFn.invoke(java.lang.Object, java.lang.Object) : java.lang.Object [55] [nargs: 3]
59 areturn
Line numbers:
[pc: 0, line: 3]
[pc: 0, line: 4]
[pc: 0, line: 4]
[pc: 21, line: 4]
[pc: 21, line: 4]
Local variable table:
[pc: 0, pc: 59] local: this index: 0 type: java.lang.Object
[pc: 0, pc: 59] local: p1__4678_SHARP index: 1 type: java.lang.Object
}
user=> (:pos (->pred ['= :pos.x 2]))
<core$__GT_pred$fn__4734 mces.core$__GT_pred$fn__4734@628016f7>
user=> ((:pos (->pred ['= :pos.x 2])) {:x 1})
false
user=> ((:pos (->pred ['= :pos.x 2])) {:x 2})
true
user=>