Fix ranges
This commit is contained in:
parent
5d3ab600f1
commit
9edace28e2
@ -360,7 +360,7 @@ public Int_t Int$random(Int_t min, Int_t max) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Range_t Int$to(Int_t from, Int_t to) {
|
public Range_t Int$to(Int_t from, Int_t to) {
|
||||||
return (Range_t){from, to, Int$compare(&to, &from, &$Int) >= 0 ? (Int_t){.small=(1<<2)|1} : (Int_t){.small=(-1/4)|1}};
|
return (Range_t){from, to, Int$compare(&to, &from, &$Int) >= 0 ? (Int_t){.small=(1<<2)|1} : (Int_t){.small=(-1>>2)|1}};
|
||||||
}
|
}
|
||||||
|
|
||||||
public Int_t Int$from_text(CORD text) {
|
public Int_t Int$from_text(CORD text) {
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
// Ranges represent numeric ranges
|
// Ranges represent numeric ranges
|
||||||
|
|
||||||
Range_t Range$reversed(Range_t r);
|
Range_t Range$reversed(Range_t r);
|
||||||
Range_t Range$by(Range_t r, int64_t step);
|
Range_t Range$by(Range_t r, Int_t step);
|
||||||
|
|
||||||
extern const TypeInfo Range;
|
extern const TypeInfo Range;
|
||||||
|
|
||||||
|
@ -850,8 +850,9 @@ CORD compile_statement(env_t *env, ast_t *ast)
|
|||||||
return CORD_all(
|
return CORD_all(
|
||||||
"{\n"
|
"{\n"
|
||||||
"const Range_t range = ", range, ";\n"
|
"const Range_t range = ", range, ";\n"
|
||||||
"if (range.step == 0) fail(\"This range has a 'step' of zero and will loop infinitely!\");\n"
|
"if (range.step.small == 0) fail(\"This range has a 'step' of zero and will loop infinitely!\");\n"
|
||||||
"for (int64_t ", value, " = range.first; range.step > 0 ? ", value, " <= range.last : ", value, " >= range.last; ", value, " += range.step) {\n"
|
"bool negative = (Int$compare_value(range.step, I(0)) < 0);\n"
|
||||||
|
"for (Int_t ", value, " = range.first; negative ? Int$compare_value(", value, ", range.last) >= 0 : Int$compare_value(", value, ", range.last) <= 0 ; ", value, " = Int$plus(", value, ", range.step)) {\n"
|
||||||
"\t", body,
|
"\t", body,
|
||||||
"\n}",
|
"\n}",
|
||||||
stop,
|
stop,
|
||||||
|
@ -344,7 +344,7 @@ env_t *for_scope(env_t *env, ast_t *ast)
|
|||||||
if (for_->vars->next)
|
if (for_->vars->next)
|
||||||
code_err(for_->vars->next->ast, "This is too many variables for this loop");
|
code_err(for_->vars->next->ast, "This is too many variables for this loop");
|
||||||
const char *var = Match(for_->vars->ast, Var)->name;
|
const char *var = Match(for_->vars->ast, Var)->name;
|
||||||
set_binding(scope, var, new(binding_t, .type=Type(IntType, .bits=64), .code=CORD_cat("$", var)));
|
set_binding(scope, var, new(binding_t, .type=INT_TYPE, .code=CORD_cat("$", var)));
|
||||||
}
|
}
|
||||||
return scope;
|
return scope;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user