This is the mail archive of the
kawa@sources.redhat.com
mailing list for the Kawa project.
RE: Compiling procedures questions
- From: "Crystal, Mayer" <mayer dot crystal at gs dot com>
- To: 'Per Bothner' <per at bothner dot com>
- Cc: "'kawa at sources dot redhat dot com'" <kawa at sources dot redhat dot com>
- Date: Tue, 28 Sep 2004 13:43:30 -0400
- Subject: RE: Compiling procedures questions
Just for clarification, I've created a simple test which illustrates the
issue I am having. The following three classes have been defined:
=====================================================================
////////////////////////////////////////////////////////
// RandomKawaProc.java
////////////////////////////////////////////////////////
import gnu.mapping.Procedure0;
import java.util.Random;
public class RandomKawaProc extends Procedure0 {
private Random random = new Random();
public RandomKawaProc( String name ) {
super( name );
}
public Object apply0() throws Throwable {
if ( random.nextDouble() > 0.5 ) {
return Boolean.TRUE;
}
return Boolean.FALSE;
}
}
======================================================================
======================================================================
////////////////////////////////////////////////////////
// KawaTestProcs.java
////////////////////////////////////////////////////////
public class KawaTestProcs {
public static final RandomKawaProc testProc1 = new RandomKawaProc(
"proc1?" );
public static final RandomKawaProc testProc2 = new RandomKawaProc(
"proc2?" );
public static final RandomKawaProc testProc3 = new RandomKawaProc(
"proc3?" );
}
======================================================================
======================================================================
////////////////////////////////////////////////////////
// KawaTest.java
////////////////////////////////////////////////////////
import gnu.mapping.Procedure;
import kawa.standard.Scheme;
public class KawaTest {
private static final String TEST_RULE = "(or proc1? (or proc2?
proc3?))";
public static void main( String[] args ) {
try {
Procedure proc = compileRule( TEST_RULE );
System.out.println( "Procedure value = " + proc.apply0() );
}
catch( Throwable t ) {
t.printStackTrace();
System.exit( 1 );
}
System.exit( 0 );
}
/**
* A helper method to compile a String rule into a Procedure.
*
* @param rule The string representation of the rule
*/
private static final Procedure compileRule( String rule ) throws
Throwable {
Scheme scheme = new Scheme( Scheme.builtin() );
scheme.eval( "(require <" + KawaTestProcs.class.getName() + ">)" );
String body = "( define (rule) " + rule + ")";
scheme.eval( body );
return (Procedure)scheme.eval( "rule" );
}
}
======================================================================
When I run the main of KawaTest the output of the println statement is:
Procedure value = #<procedure proc1?>
What I was trying to do though was to get the result as true or false.
Thanks,
Mayer
-----Original Message-----
From: Per Bothner [mailto:per@bothner.com]
Sent: Tuesday, September 28, 2004 1:51 AM
To: Crystal, Mayer
Cc: 'kawa@sources.redhat.com'
Subject: Re: Compiling procedures questions
Crystal, Mayer wrote:
> In other words, my code looks something like:
>
> 1. String rule = "(or proc1? (or proc2? proc3?))";
I'd recommend wrapping the rule in a function.
Scheme doesn't have the concept of evaluating a module -
e.g. "load" returns an undefined result. Yes, there are
ways in Kawa, but they're a bit more tricky, as the default behavior is to
ignore the values of top-level expressions.
String body = "(define (rule) (or ...))";
> 2. Procedure moduleBody = compileRule( rule );
> 3. return ((Boolean)moduleBody.apply0()).booleanValue();
;; Get the "rule" function in the Scheme global environment: Procedure rule
= scheme.eval("rule");
(Boolean) rule.apply0()
--
--Per Bothner
per@bothner.com http://per.bothner.com/