Jess's "apply" differs from the classic Lisp "apply" in that the
varargs are in the "apply" funcall, rather than being bundled up in a
list. This is by accident rather than by design, I'm afraid. In
classic Lisp, this form

(apply str-cat "foo" " bar" " baz")

is an error, but in Jess, it's correct. In classic Lisp, you'd have
to say something like

(apply 'str-cat (list "foo" " bar" " baz")). 

to get the same effect.


I think Steve Solomon wrote:
> Jess> (apply str-cat "foo" " bar" " baz")
> "foo bar baz"

Here there are three arguments to str-cat; each is converted into a
String, the strings concatenated, and the result is returned as a
String.

> 
> Jess> (deffunction test ($?args) (apply str-cat ?args))
> Jess> (test "foo" " bar" " baz")
> "\"foo\" \" bar\" \" baz\""

Here, on the other hand, there is just one, the list in ?args. That
list is converted to a String, and that String is returned. 

> To concatenate strings inside a function currently I use a foreach loop:
> (bind ?res "")
> (foreach ?str ?args (bind ?res (str-cat ?res ?str)))
> where ?args is the multifield parameter of the function as above.
  
Here's an (untested, but probably works) "apply*" function which acts
like classic Lisp "apply". Feel free to use it:

import jess.*;
public class ApplyStar implements Userfunction, Serializable {
    public String getName() { return "apply*"; }
    public Value call(ValueVector vv, Context c) {
        Funcall f = new Funcall(vv.get(1).stringValue(c), c.getEngine());
        ValueVector args = vv.get(2).listValue(c);
        for (int i = 0; i < args.size(); i++)
            f.arg(args.get(i));
        return f.execute(c);
    }
}

---------------------------------------------------------
Ernest Friedman-Hill  
Advanced Software Research          Phone: (925) 294-2154
Sandia National Labs                FAX:   (925) 294-2234
PO Box 969, MS 9012                 [EMAIL PROTECTED]
Livermore, CA 94550         http://herzberg.ca.sandia.gov

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