38 lines
1.3 KiB
Java
38 lines
1.3 KiB
Java
package function.builtin.math;
|
|
|
|
import java.util.function.*;
|
|
|
|
import sexpression.*;
|
|
|
|
class MathFunction {
|
|
|
|
Function<LispNumber, LispNumber> singleValueOperation;
|
|
BiFunction<LispNumber, LispNumber, LispNumber> multipleValueOperation;
|
|
|
|
public MathFunction(Function<LispNumber, LispNumber> singleValueOperation,
|
|
BiFunction<LispNumber, LispNumber, LispNumber> multipleValueOperation) {
|
|
this.singleValueOperation = singleValueOperation;
|
|
this.multipleValueOperation = multipleValueOperation;
|
|
}
|
|
|
|
public SExpression callTailRecursive(Cons argumentList) {
|
|
Cons remainingArguments = (Cons) argumentList.getCdr();
|
|
SExpression firstArgument = argumentList.getCar();
|
|
LispNumber number1 = (LispNumber) firstArgument;
|
|
|
|
if (remainingArguments.nullp())
|
|
return singleValueOperation.apply(number1);
|
|
|
|
SExpression secondArgument = remainingArguments.getCar();
|
|
LispNumber number2 = (LispNumber) secondArgument;
|
|
LispNumber operationResult = multipleValueOperation.apply(number1, number2);
|
|
SExpression remainingNumbers = remainingArguments.getCdr();
|
|
|
|
if (remainingNumbers.nullp())
|
|
return operationResult;
|
|
|
|
return callTailRecursive(new Cons(operationResult, remainingNumbers));
|
|
}
|
|
|
|
}
|