Thanks for providing the function ;)

On Aug 25, 2008, at 3:55 AM, Wolfgang Laun wrote:

Thanks for finding this bug.

You have seen that this can (now) be done using the builtin call.

Just to set the record straight, the fix should be in one if earlier,
where we test that some things have to be evaluated in the current
context before we really know what we have.

      if (valArg1.type() == RU.VARIABLE ||
          valArg1.type() == RU.FUNCALL) ||
          valArg1.type() == RU.BINDING ) {
           valArg1 = valArg1.resolveValue(context);
       }

       // This must now be a lambda expression or a binding.
       if (valArg1.type() != RU.LAMBDA ) {
           throw new JessException(
                                   NAME,
                                   "first argument is not a lambda
definition.",
                                   Integer.toString(valArg1.type()));
       }


On Thu, Aug 14, 2008 at 6:51 PM, Hal Hildebrand
<[EMAIL PROTECTED]> wrote:
So I figured out how to fix this to do what I want.  Basically, the
CallLambda Userfunction needs to check that the first argument is a
RU.BINDING in addtion to RU.LAMBDA.  This this fix, things work as
I would
like them to.  Nice addition - and powerful, too.
public class CallLambda implements Userfunction {
   private static final String NAME = "lcall";
   /** Get the name of the Jess function.
    * @see jess.Userfunction#getName()
    */
   public String getName() {
       return NAME;
   }
   /** Call the userfunction
    * @see jess.Userfunction#call(jess.ValueVector, jess.Context)
    */
   public Value call(ValueVector vv, Context context) throws
JessException
{
       int narg = vv.size() - 1;
       // Check that we have at least one element.
       if (narg < 1)
           throw new JessException(NAME, "missing argument.", "");
       // Evluate a variable or a function call.
       Value valArg1 = vv.get(1);
       if (valArg1.type() == RU.VARIABLE || valArg1.type() ==
RU.FUNCALL) {
           valArg1 = valArg1.resolveValue(context);
       }



       // This must now be a lambda expression or a binding.
       if (valArg1.type() != RU.LAMBDA && valArg1.type() !=
RU.BINDING) {
           throw new JessException(
                                   NAME,
                                   "first argument is not a lambda
definition.",
                                   Integer.toString(valArg1.type()));
       }
       // Get the function value,...
       Deffunction d = (Deffunction) valArg1.functionValue(context);
       // ...construct the argument list and...
       ValueVector av = new ValueVector(narg);
       av.add(d.getName());
       for (int iArg = 2; iArg <= narg; iArg++) {
           av.add(vv.get(iArg));
       }
       // ...call and return the result.
       return d.call(av, context);
   }
}
On Aug 14, 2008, at 9:04 AM, Hal Hildebrand wrote:

Have tried using the CallLambda Userfunction class from
http://herzberg.ca.sandia.gov/jesswiki/view?LambdaCallUserFunction
(load-function CallLambda)
(deftemplate functional-fact
   (slot func)
   )
(bind ?f (lambda (?x) (> 1 ?x)))
(assert (functional-fact (func ?f)))
(defrule test-me
   (functional-fact (func ?f))
   (test (lcall ?f 0))
   =>
   (printout t "1 > 0" crlf))
fails with:
Jess reported an error in routine lcall
while executing (lcall ?f 0)
while executing 'test' CE
while executing rule LHS (TECT).
 Message: first argument is not a lambda definition. 4096.
 Program text: ( defrule test-me ( functional-fact ( func ?f ) )
( test (
lcall ?f 0 ) ) = > ( printout t "1 > 0" crlf ) )  at line 17.
Seems as though nothing I can do with the slot value will turn it
into a
function call.
On Aug 14, 2008, at 8:23 AM, Hal Hildebrand wrote:

I would like to have functions contained in the slot value of a
fact and
then apply them.  I can create and assign the function values by
using
(lambda ...), which seems to be what I'm looking for on that side
of the
equation:
(deftemplate functional-fact
   (slot func)
   )
(assert (functional-fact (func (lambda (?x) (> 1 ?x)))))
However, the question becomes how do I actually call this
function?  What I
would like to do is use these in test CE:
(deftemplate functional-fact
   (slot func)
   )
(assert (functional-fact (func (lambda (?x) (> 1 ?x)))))
(defrule test-me
   (functional-fact (func ?function))
   (test (?function 0))
   =>
   (printout t "1 > 0" crlf))
However, this does not work as I would expect instead failing with:
Jess reported an error in routine call
while executing (call ?function 0)
while executing 'test' CE
while executing rule LHS (TECT).
 Message: No method named '0' found in class jess.Deffunction.
 Program text: ( defrule test-me ( functional-fact ( func ?
function ) ) (
test ( ?function 0 ) ) = > ( printout t "1 > 0" crlf ) )  at line 11.
Clearly, I'm not understanding this and would appreciate any help
from those
on the list.
Thanks.





--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users
[EMAIL PROTECTED]'
in the BODY of a message to [EMAIL PROTECTED], NOT to the list
(use your own address!) List problems? Notify [EMAIL PROTECTED]
.
--------------------------------------------------------------------




--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users [EMAIL PROTECTED]'
in the BODY of a message to [EMAIL PROTECTED], NOT to the list
(use your own address!) List problems? Notify [EMAIL PROTECTED]
--------------------------------------------------------------------

Reply via email to