If you rely heavily on enums, you might consider using a userfunction
that binds enum constants to Jess variables - so you don't need the
parentheses.

http://www.jessrules.com/jesswiki/view?BindEnumUserFunction

-W

On 12/03/2012, Friedman-Hill, Ernest <ejfr...@sandia.gov> wrote:
> The Jess language is not Java, it's Lisp by design, and parentheses just
> work differently. All functions calls look like (fooFunction a b c), and if
> there's no arguments, it's just (fooFunction). There are never parentheses
> just surrounding the arguments.
>
> For using enums, look here:
> http://www.jessrules.com/jesswiki/view?EnumeratedTypes . The upshot is that
> "import" will defined some functions for you which return the enum's values;
> to get the value, you have to call the function. So there's one more set of
> parentheses:
>
>    ((UnitType$UnitTypes.Terran_Supply_Depot) ordinal)
>
>
>
> From: Hunter McMillen <mcmil...@gmail.com<mailto:mcmil...@gmail.com>>
> Reply-To: <jess-users@sandia.gov<mailto:jess-users@sandia.gov>>
> Date: Mon, 12 Mar 2012 15:59:45 -0400
> To: <jess-users@sandia.gov<mailto:jess-users@sandia.gov>>
> Subject: Re: JESS: [EXTERNAL] Jess exception: ' ' is a list, not a string
>
> That was exactly the problem, thanks. What is the general rule for function
> calling in Jess, always without parentheses? I never would have caught that
> error because when I see something like get-next-build-tile() the
> parentheses tell me it is a function. Seeing it without the parens makes me
> think it is a variable, even without the ? sign is front.
>
> Also, as a corollary question; I am using an enumerated type in my rule:
>
> (import eisbot.proxy.types.UnitType$UnitTypes)
>
> (defrule build-supply-depot
> (minerals (value ?x&:(> ?x 100)))
> =>
> (try
> (foreach ?u (?*bwapi* getMyUnits)
> (if (= (?u getTypeID) ?*SCV_ID*) then
> (bind ?p (call get-next-build-tile()))
> (call ?*bwapi* drawCircle ?p.x ?p.y 100 111 FALSE FALSE)
> (call ?*bwapi* build (?u getID) ?p.x ?p.y
> (UnitType$UnitTypes.Terran_Supply_Depot ordinal))
> (break)))
> catch
> (printout t (call ?ERROR toString) crlf)
> )
> )
>
> But after importing when my rule tries to execute the bolded line above, I
> get a class not found exception:
>
>   Message: Class not found.
>         at jess.dx.call(Unknown Source)
>         at jess.ac.a(Unknown Source)
>         at jess.Funcall.execute(Unknown Source)
>         at jess.FuncallValue.resolveValue(Unknown Source)
>         at jess.dx.call(Unknown Source)
>         at jess.ac.a(Unknown Source)
>         at jess.Funcall.execute(Unknown Source)
>         at jess.FuncallValue.resolveValue(Unknown Source)
>         at jess.f4.call(Unknown Source)
>         at jess.ac.a(Unknown Source)
>         at jess.Funcall.execute(Unknown Source)
>         at jess.FuncallValue.resolveValue(Unknown Source)
>         at jess.cu.a(Unknown Source)
>         at jess.cu.call(Unknown Source)
>         at jess.ac.a(Unknown Source)
>         at jess.Funcall.execute(Unknown Source)
>         at jess.Defrule.a(Unknown Source)
>         at jess.Activation.a(Unknown Source)
>         at jess.en.a(Unknown Source)
>         at jess.en.a(Unknown Source)
>         at jess.Rete.if(Unknown Source)
>         at jess.Rete.run(Unknown Source)
>         at hunterai.HunterAIClient.gameUpdate(HunterAIClient.java:156)
>         at eisbot.proxy.JNIBWAPI.gameUpdate(JNIBWAPI.java:795)
>         at eisbot.proxy.JNIBWAPI.startClient(Native Method)
>         at eisbot.proxy.JNIBWAPI.start(JNIBWAPI.java:597)
>         at hunterai.HunterAIClient.start(HunterAIClient.java:102)
>         at hunterai.HunterAIClient.main(HunterAIClient.java:42)
> Caused by: java.lang.ClassNotFoundException: new
>         at java.net.URLClassLoader$1.run(Unknown Source)
>         at java.net.URLClassLoader$1.run(Unknown Source)
>         at java.security.AccessController.doPrivileged(Native Method)
>         at java.net.URLClassLoader.findClass(Unknown Source)
>         at java.lang.ClassLoader.loadClass(Unknown Source)
>         at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
>         at java.lang.ClassLoader.loadClass(Unknown Source)
>         at java.lang.Class.forName0(Native Method)
>         at java.lang.Class.forName(Unknown Source)
>         at jess.dc.for(Unknown Source)
>         at jess.dc.if(Unknown Source)
>         at jess.Rete.findClass(Unknown Source)
>         ... 28 more
>
> any ideas?
>
> Hunter
>
>
>
>
> On Mon, Mar 12, 2012 at 1:48 PM, Friedman-Hill, Ernest
> <ejfr...@sandia.gov<mailto:ejfr...@sandia.gov>> wrote:
> OK, I looked in the magic decoder file and I see a "call" being invoked
> inside a "bind", so that fits only the line of code below. And lo and
> behold, look at it: the second argument to "call", which should be the name
> of the function to call, is a pair of empty parentheses — i.e., a list. This
> line is asking Jess to to call the static method named "()" on the class
> named "get-next-build-tile" -- surely not what you intended. If you're just
> calling a deffunction by this name, then you just want
>
> (bind ?p (get-next-build-tile))
>
> From: Hunter McMillen <mcmil...@gmail.com<mailto:mcmil...@gmail.com>>
> Reply-To: <jess-users@sandia.gov<mailto:jess-users@sandia.gov>>
> Date: Mon, 12 Mar 2012 12:16:29 -0400
> To: <jess-users@sandia.gov<mailto:jess-users@sandia.gov>>
> Subject: Re: JESS: [EXTERNAL] Jess exception: ' ' is a list, not a string
>
> (bind ?p (call get-next-build-tile()))
>
>
>



--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users y...@address.com'
in the BODY of a message to majord...@sandia.gov, NOT to the list
(use your own address!) List problems? Notify owner-jess-us...@sandia.gov.
--------------------------------------------------------------------

Reply via email to