transcendental-lisp/src/function/builtin/math/MULTIPLY.java

35 lines
1018 B
Java

package function.builtin.math;
import static sexpression.LispNumber.ONE;
import function.ArgumentValidator;
import function.FunctionNames;
import function.LispFunction;
import sexpression.Cons;
import sexpression.LispNumber;
@FunctionNames({ "*" })
public class MULTIPLY extends LispFunction {
private ArgumentValidator argumentValidator;
private MathFunction mathFunction;
public MULTIPLY(String name) {
this.argumentValidator = new ArgumentValidator(name);
this.argumentValidator.setEveryArgumentExpectedType(LispNumber.class);
this.mathFunction = new MathFunction(number -> number, this::multiply);
}
@Override
public LispNumber call(Cons argumentList) {
argumentValidator.validate(argumentList);
return mathFunction.callTailRecursive(new Cons(ONE, argumentList)).invoke();
}
private LispNumber multiply(LispNumber number1, LispNumber number2) {
return new LispNumber(number1.getValue().multiply(number2.getValue()));
}
}