aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2025-12-16 23:31:06 -0500
committerBruce Hill <bruce@bruce-hill.com>2025-12-16 23:31:06 -0500
commitf07c07e551b89b66b14936ae4573e656fbd7afb6 (patch)
tree3c9acb1228c7e74ce671661bf9c15616e0cfc7f7
parentc5878cced02fd1ed7e7940eaf8eb8b4cce23a9d4 (diff)
Fix parens parsing and hook up sqrt
-rw-r--r--src/compile/expressions.c11
-rw-r--r--src/environment.c1
-rw-r--r--src/stdlib/reals.c2
-rw-r--r--src/stdlib/reals.h2
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);