JESS: [EXTERNAL] No cast needed when inspecting shadow facts' data members?

classic Classic list List threaded Threaded
2 messages Options
hlc
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

JESS: [EXTERNAL] No cast needed when inspecting shadow facts' data members?

hlc
Hi,

I've just noticed an interesting behavior of Jess.
I was working with a couple of classes like this:

public class X {
    Object obj;
    // getter and setter for obj
    ...
}

public class Y {
    int i;
    // getter and setter for i
    ...
}

Then in Jess I wrote:

(deftemplate X (declare (from-class X)))
(deftemplate a (slot s))

(defrule r
    (X (obj ?o))
    (test (eq ((?o getClass) getSimpleName) "Y"))
    (a (s ?o.i))
    =>
    (printout t ?o.i crlf))

(bind ?x (new X))
(bind ?y (new Y))
(?y setI 123)
(?x setObj ?y)
(add ?x)
(run)

This actually works! My surprise is related with the fact that the obj data member is declared as an Object, and the _i_ data member only exists for instances of Y. Despite this, the rule is able to get ?o.i in both the LHS adn the RHS (no cast needed). Of course if I remove the test in the rule and add to working memory an instance of X for which the obj is not an Y, I get a runtime exception.

Is there anything I should know about the appropriateness of implementations such as this? Best practices?

Thank you in advance.

Henrique

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

RE: JESS: [EXTERNAL] No cast needed when inspecting shadow facts' data members?

Friedman-Hill, Ernest

Jess doesn’t actually try to look for the “I” member until the code actually runs, so it really has no choice but to accept the code as written. This really isn’t any different from how other dynamically typed languages behave; Java, being a strongly/statically typed language that would not allow this kind of code is actually unusual these days. Ruby, Python, Scala, Groovy, etc would all allow this sort of thing, no casting needed.

 

From: [hidden email] [mailto:[hidden email]] On Behalf Of Henrique Lopes Cardoso
Sent: Friday, May 10, 2013 9:16 AM
To: jess-users
Subject: JESS: [EXTERNAL] No cast needed when inspecting shadow facts' data members?

 

Hi,

 

I've just noticed an interesting behavior of Jess.

I was working with a couple of classes like this:

 

public class X {

    Object obj;

    // getter and setter for obj

    ...

}

 

public class Y {

    int i;

    // getter and setter for i

    ...

}

 

Then in Jess I wrote:

 

(deftemplate X (declare (from-class X)))

(deftemplate a (slot s))

 

(defrule r

    (X (obj ?o))

    (test (eq ((?o getClass) getSimpleName) "Y"))

    (a (s ?o.i))

    =>

    (printout t ?o.i crlf))

 

(bind ?x (new X))

(bind ?y (new Y))

(?y setI 123)

(?x setObj ?y)

(add ?x)

(run)

 

This actually works! My surprise is related with the fact that the obj data member is declared as an Object, and the _i_ data member only exists for instances of Y. Despite this, the rule is able to get ?o.i in both the LHS adn the RHS (no cast needed). Of course if I remove the test in the rule and add to working memory an instance of X for which the obj is not an Y, I get a runtime exception.

 

Is there anything I should know about the appropriateness of implementations such as this? Best practices?

 

Thank you in advance.

 

Henrique

 

Loading...