/*
* Copyright 2007-2013
* Licensed under GNU Lesser General Public License
*
* This file is part of EpochX: genetic programming software for research
*
* EpochX is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EpochX is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with EpochX. If not, see <http://www.gnu.org/licenses/>.
*
* The latest version is available from: http://www.epochx.org
*/
package org.epochx.interpret;
import org.epochx.Individual;
/**
* Interpreters provide a mechanism for executing program source code that is
* being evolved by a grammar based representation or otherwise. There are two
* approaches to execute program strings provided depending upon the nature of
* the evolved code.
*
* <h4>Expression evaluation</h4>
*
* <p>
* The <code>eval</code> methods are for use on program strings that represent
* an individual expression, that will have an individual return value. A simple
* example of this is a nested lisp expression. The result of evaluating the
* expression will be returned from the method call.
*
* <h4>Statement execution</h4>
*
* <p>
* The <code>exec</code> methods are for executing program strings that
* represent one or more full program statements. No value will be returned by
* these methods so the programs are expected to have other side effects.
*
* @since 2.0
*/
public interface Interpreter<T extends Individual> {
/**
* Evaluates an expression multiple times with each set of argument values
* given. The expressions may contain the use of any argument named in the
* <code>argNames</code> array which will be provided with the
* associated value from the <code>argValues</code> array. The returned
* array will be the return values from the candidate program for each of the
* sets of argument values in order. The number of evaluations that take place
* should be equal to the size of the argNames/argValues arrays and also
* equal to the size of the returned Object array.
*
* @param expression the expression string that is to be evaluated multple
* times.
* @param argNames an array of arguments that each of the sets of argValues
* should be assigned to. The array should have equal
* length to the argValues array.
* @param argValues argument values to be assigned to the specified argument
* names. Each element is an array of argument values for
* one evaluation. As such there should be argValues.length
* evaluations and argValues.length elements in the
* returned Object array. The array should also have equal
* length to the argNames array.
* @return an array of objects which are the return values from evaluating
* the expression with each set of argument values. The type of the
* returned Objects may vary from program to program.
* @throws MalformedProgramException if the given expression is not valid
* according to the language's syntax rules.
*/
public Object[] eval(T expression, String[] argNames, Object[][] argValues) throws MalformedProgramException;
/**
* Executes a program which may consist of multiple program statements,
* multiple times. Each time the program is executed it will be provided
* with a different set of variable values as given by the 2-dimensional
* <code>argValues</code> array. The program is expected to have
* side-effects and no values will be returned.
*
* @param program the program source code that is to be executed.
* @param argNames an array of arguments that each of the sets of argValues
* should be assigned to. The array should have equal
* length to the argValues array.
* @param argValues argument values to be assigned to the specified argument
* names. Each element is an array of argument values for
* one evaluation. As such there should be argValues.length
* evaluations and argValues.length elements in the
* returned Object array. The array should also have equal
* length to the argNames array.
* @throws MalformedProgramException if the given program is not valid
* according to the language's syntax rules.
*/
public void exec(T program, String[] argNames, Object[][] argValues) throws MalformedProgramException;
}