Skip to content

Instantly share code, notes, and snippets.

@mmower
Created February 21, 2014 02:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mmower/d20bdf176a993476109d to your computer and use it in GitHub Desktop.
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=>
@mmower
Copy link
Author

mmower commented Feb 21, 2014

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=>

@mmower
Copy link
Author

mmower commented Feb 21, 2014

(find-entities world [{:pos #(= (get %1 :x) 19)}])
=> #{#uuid "5306c4de-5e61-4484-9f32-db204c622293"}

@mmower
Copy link
Author

mmower commented Feb 21, 2014

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

}

@mmower
Copy link
Author

mmower commented Feb 21, 2014

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

}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment