Hello group! I am a Clojure user and would like to look into using Drools with it. From Clojure I can use all Java classes and call all methods. So, instantiating a KnowledgeBase, KnowledgePackages or a KBFactory is no problem, and calling the respective methods, to get the system started, or insert facts into a session, dispose it and fireAllRules is also fine.
It is just that in Clojure one typically does not use POJOs. The most typical data structures used are: hashmaps, vectors, structs, lists, structuremaps and sets (in no particular order). Those are persistent and "concurrency ready" Clojure DSs, and btw, also usable from Java directly. Now the basic Drools examples I saw all work with POJOs. They were mostly comparisons of native typed fields in a class. I however would be interested to compare different qualities of key/ value pairs in a hashmap, or compare structs with each other. Comparing structuremaps is maybe what comes closest to the POJO examples. For example, we may have a struct (defstruct person :name :age :type) and store it's instances in a vector. And we would also insert it into our Drools session object: (doseq [p all-persons] (.insert session p)) which would correspond roughly to for (Person p : allPersons) { session.insert(p); } Only that "person" is a map, not a class. Well, of course it is also an object and under the hood a class, a java.util.Map even - but I mean that unlike POJOs the key/value pairs are stored differently (fields in classes are also just key/value pairs). So, is there a way to insert maps (let it be java.util.HashMaps for example) and also to reason about them? I won't care if the syntax for that is complicated. As Clojure is a Lisp I would just write a little macro and have a very nice and readable syntax (probably a bit similar to the one of Jess or Lisa). Instead of looking at all instances of the type Person AND then have their age compared, I would look at all maps/structs which have a key :type with the value :person AND then compare the value of their :age key with a number, such as: (rule "example person rule, matching non-adults" :when (= :type :person) (< :age 18) :then (println "No service for minors.")) In Java terms it would mean that we insert several instances of java.util.HashMap, all having the k/v pairs for name, age and type. HashMap<String, Object> hm = new HashMap<String, Object>(); hm.put("name", someName); hm.put("age", someAge); hm.put("type", "person"); session.insert(hm); Is that in principle possible with Drools 5? Sunny greetings, André -- Lisp is not dead. It’s just the URL that has changed: http://clojure.org/ _______________________________________________ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users