Skip to content

Commit 655f602

Browse files
committed
range
1 parent f941975 commit 655f602

File tree

1 file changed

+15
-14
lines changed

1 file changed

+15
-14
lines changed

src/main/java/org/devore/module/CoreModule.java

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.io.IOException;
1313
import java.math.BigDecimal;
1414
import java.math.BigInteger;
15+
import java.math.MathContext;
1516
import java.math.RoundingMode;
1617
import java.nio.file.Files;
1718
import java.nio.file.Path;
@@ -741,22 +742,22 @@ else if (ast.size() > 2)
741742
return DList.valueOf(result);
742743
}), 2, false);
743744
dEnv.addTokenFunction("range", ((args, env) -> {
744-
if (!(args.getFirst() instanceof DInt))
745-
throw new DevoreCastException(args.getFirst().type(), "int");
746-
if (args.size() > 1 && !(args.get(1) instanceof DInt))
747-
throw new DevoreCastException(args.get(1).type(), "int");
748-
if (args.size() > 2 && !(args.get(2) instanceof DInt))
749-
throw new DevoreCastException(args.get(2).type(), "int");
750-
BigInteger start = args.size() > 1 ? ((DInt) args.getFirst()).toBigInteger() : BigInteger.ZERO;
751-
BigInteger end = args.size() > 1 ? ((DInt) args.get(1)).toBigInteger().subtract(BigInteger.ONE)
752-
: ((DInt) args.getFirst()).toBigInteger().subtract(BigInteger.ONE);
753-
BigInteger step = args.size() > 2 ? ((DInt) args.get(2)).toBigInteger() : BigInteger.ONE;
754-
BigInteger size = end.subtract(start).divide(step);
745+
if (!(args.getFirst() instanceof DNumber))
746+
throw new DevoreCastException(args.getFirst().type(), "number");
747+
if (args.size() > 1 && !(args.get(1) instanceof DNumber))
748+
throw new DevoreCastException(args.get(1).type(), "number");
749+
if (args.size() > 2 && !(args.get(2) instanceof DNumber))
750+
throw new DevoreCastException(args.get(2).type(), "number");
751+
BigDecimal start = args.size() > 1 ? ((DNumber) args.getFirst()).toBigDecimal() : BigDecimal.ZERO;
752+
BigDecimal end = args.size() > 1 ? ((DNumber) args.get(1)).toBigDecimal().subtract(BigDecimal.ONE)
753+
: ((DNumber) args.getFirst()).toBigDecimal().subtract(BigDecimal.ONE);
754+
BigDecimal step = args.size() > 2 ? ((DNumber) args.get(2)).toBigDecimal() : BigDecimal.ONE;
755+
BigDecimal size = end.subtract(start).divide(step, MathContext.DECIMAL128);
755756
List<Token> list = new ArrayList<>();
756-
BigInteger i = BigInteger.ZERO;
757+
BigDecimal i = BigDecimal.ZERO;
757758
while (i.compareTo(size) < 1) {
758-
list.add(DInt.valueOf(start.add(i.multiply(step))));
759-
i = i.add(BigInteger.ONE);
759+
list.add(DFloat.valueOf(start.add(i.multiply(step))));
760+
i = i.add(BigDecimal.ONE);
760761
}
761762
return DList.valueOf(list);
762763
}), 1, true);

0 commit comments

Comments
 (0)