diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2025-12-16 23:31:06 -0500 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2025-12-16 23:31:06 -0500 |
| commit | f07c07e551b89b66b14936ae4573e656fbd7afb6 (patch) | |
| tree | 3c9acb1228c7e74ce671661bf9c15616e0cfc7f7 | |
| parent | c5878cced02fd1ed7e7940eaf8eb8b4cce23a9d4 (diff) | |
Fix parens parsing and hook up sqrt
| -rw-r--r-- | src/compile/expressions.c | 11 | ||||
| -rw-r--r-- | src/environment.c | 1 | ||||
| -rw-r--r-- | src/stdlib/reals.c | 2 | ||||
| -rw-r--r-- | src/stdlib/reals.h | 2 |
4 files changed, 7 insertions, 9 deletions
diff --git a/src/compile/expressions.c b/src/compile/expressions.c index f249993f..638480bd 100644 --- a/src/compile/expressions.c +++ b/src/compile/expressions.c @@ -110,14 +110,11 @@ Text_t compile(env_t *env, ast_t *ast) { case Num: { // return Text$from_str(String(hex_double(Match(ast, Num)->n))); Text_t original = Text$from_str(String(string_slice(ast->start, (size_t)(ast->end - ast->start)))); - // Text_t roundtrip = Text$from_str(String(Match(ast, Num)->n)); - // original = Text$replace(original, Text("_"), EMPTY_TEXT); - // original = Text$without_suffix(original, Text(".")); - // if (Text$equal_values(original, roundtrip)) { - // return Texts("Real$from_float64(", Text$from_str(String(hex_double(Match(ast, Num)->n))), ")"); - // } else { + original = Text$replace(original, Text("_"), EMPTY_TEXT); + original = Text$replace(original, Text("("), EMPTY_TEXT); + original = Text$replace(original, Text(")"), EMPTY_TEXT); + original = Text$replace(original, Text(" "), EMPTY_TEXT); return Texts("Real$parse(Text(\"", original, "\"), NULL)"); - // } } case Not: { ast_t *value = Match(ast, Not)->value; diff --git a/src/environment.c b/src/environment.c index d1618d9a..f59194d4 100644 --- a/src/environment.c +++ b/src/environment.c @@ -298,6 +298,7 @@ env_t *global_env(bool source_mapping) { {"negative", "Real$negative", "func(x:Real -> Real)"}, // {"plus", "Real$plus", "func(x,y:Real -> Real)"}, // {"power", "Real$power", "func(base:Real,exponent:Real -> Real)"}, // + {"sqrt", "Real$sqrt", "func(x:Real -> Real)"}, // {"times", "Real$times", "func(x,y:Real -> Real)"}, // ), MAKE_TYPE( // diff --git a/src/stdlib/reals.c b/src/stdlib/reals.c index 40f4cf4c..aee39414 100644 --- a/src/stdlib/reals.c +++ b/src/stdlib/reals.c @@ -240,7 +240,7 @@ Real_t Real$divided_by(Real_t x, Real_t y) { } static Int_t Real$compute_sqrt(Real_t r, int64_t decimals) { - Real_t operand = &r->userdata.children[0]; + Real_t operand = r->userdata.children; double d = Real$as_float64(operand); // TODO: newton's method to iterate return Int$from_float64(sqrt(d) * pow(10.0, (double)decimals), true); diff --git a/src/stdlib/reals.h b/src/stdlib/reals.h index 1d304aa5..8750fdbb 100644 --- a/src/stdlib/reals.h +++ b/src/stdlib/reals.h @@ -18,7 +18,7 @@ double Real$as_float64(Real_t x); Int_t Real$as_int(Real_t x); Real_t Real$negative(Real_t x); -// Real_t Real$inverse(Real_t x); +Real_t Real$sqrt(Real_t x); Real_t Real$plus(Real_t x, Real_t y); Real_t Real$minus(Real_t x, Real_t y); Real_t Real$times(Real_t x, Real_t y); |
