22#include < lbd/utils/string_escape.h>
33
44namespace runtime ::builtins {
5- // Prints Argument to stdout and returns 0.
6- NativeFunction makePrint () {
7- const std::string name = " print" ;
8- const auto signature = functionType (
9- {simpleType (type::TypeTag::Any)},
10- nullptr ,
11- true
12- );
13- return {
14- name, signature, [](const std::vector<std::shared_ptr<Thunk> > &arguments,
15- const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
16- for (auto &argument: arguments) {
17- const Value &value = argument->force ();
18- std::cout << value;
19- }
20- return std::make_pair (Value{static_cast <double >(0 )}, ResultOptions{.sideEffects = true });
21- }
22- };
23- }
24-
255 NativeFunction makeAdd () {
266 const std::string name = " add" ;
277 const auto signature = functionType (
288 {simpleType (type::TypeTag::Float), simpleType (type::TypeTag::Float)},
299 simpleType (type::TypeTag::Float)
3010 );
3111 return {
32- name, signature, [name ](const std::vector<std::shared_ptr<Thunk> > &arguments,
33- const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
12+ name, signature, [](const std::vector<std::shared_ptr<Thunk> > &arguments,
13+ const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
3414 const Value &value1 = arguments[0 ]->force ();
3515 const Value &value2 = arguments[1 ]->force ();
36- if (!std::holds_alternative<double >(value1) || !std::holds_alternative<double >(value2)) {
37- optionsValue.logger .error ({}, " runtime error: wrong arguments provided to native function " , name,
38- " \n " , name, " signature: Float -> Float -> Float" );
39- }
4016 const double result = std::get<double >(value1) + std::get<double >(value2);
4117 return std::make_pair (Value{result}, ResultOptions{});
4218 }
@@ -50,14 +26,10 @@ namespace runtime::builtins {
5026 simpleType (type::TypeTag::Float)
5127 );
5228 return {
53- name, signature, [name ](const std::vector<std::shared_ptr<Thunk> > &arguments,
54- const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
29+ name, signature, [](const std::vector<std::shared_ptr<Thunk> > &arguments,
30+ const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
5531 const Value &value1 = arguments[0 ]->force ();
5632 const Value &value2 = arguments[1 ]->force ();
57- if (!std::holds_alternative<double >(value1) || !std::holds_alternative<double >(value2)) {
58- optionsValue.logger .error ({}, " runtime error: wrong arguments provided to native function " , name,
59- " \n " , name, " signature: Float -> Float -> Float" );
60- }
6133 const double result = std::get<double >(value1) - std::get<double >(value2);
6234 return std::make_pair (Value{result}, ResultOptions{});
6335 }
@@ -71,14 +43,10 @@ namespace runtime::builtins {
7143 simpleType (type::TypeTag::Float)
7244 );
7345 return {
74- name, signature, [name ](const std::vector<std::shared_ptr<Thunk> > &arguments,
75- const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
46+ name, signature, [](const std::vector<std::shared_ptr<Thunk> > &arguments,
47+ const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
7648 const Value &value1 = arguments[0 ]->force ();
7749 const Value &value2 = arguments[1 ]->force ();
78- if (!std::holds_alternative<double >(value1) || !std::holds_alternative<double >(value2)) {
79- optionsValue.logger .error ({}, " runtime error: wrong arguments provided to native function " , name,
80- " \n " , name, " signature: Float -> Float -> Float" );
81- }
8250 const double result = std::get<double >(value1) * std::get<double >(value2);
8351 return std::make_pair (Value{result}, ResultOptions{});
8452 }
@@ -92,14 +60,10 @@ namespace runtime::builtins {
9260 simpleType (type::TypeTag::Float)
9361 );
9462 return {
95- name, signature, [name ](const std::vector<std::shared_ptr<Thunk> > &arguments,
96- const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
63+ name, signature, [](const std::vector<std::shared_ptr<Thunk> > &arguments,
64+ const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
9765 const Value &value1 = arguments[0 ]->force ();
9866 const Value &value2 = arguments[1 ]->force ();
99- if (!std::holds_alternative<double >(value1) || !std::holds_alternative<double >(value2)) {
100- optionsValue.logger .error ({}, " runtime error: wrong arguments provided to native function " , name,
101- " \n " , name, " signature: Float -> Float -> Float" );
102- }
10367 const double num1 = std::get<double >(value1);
10468 const double num2 = std::get<double >(value2);
10569 const int result = num1 < num2 ? -1 : num1 > num2 ? 1 : 0 ;
@@ -120,14 +84,9 @@ namespace runtime::builtins {
12084 simpleType (type::TypeTag::Any)
12185 );
12286 return {
123- name, signature, [name ](const std::vector<std::shared_ptr<Thunk> > &arguments,
124- const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
87+ name, signature, [](const std::vector<std::shared_ptr<Thunk> > &arguments,
88+ const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
12589 const Value &conditionValue = arguments[0 ]->force ();
126- if (!std::holds_alternative<double >(conditionValue)) {
127- optionsValue.logger .error ({}, " runtime error: wrong arguments provided to native function " , name,
128- " \n " , name, " signature: Float -> A -> B -> A|B\n "
129- " runtime error: expected <double> got " , conditionValue);
130- }
13190 // Lazy branching: only force the chosen clause.
13291 if (const double condition = std::get<double >(conditionValue); condition == 0.0 ) {
13392 return std::make_pair (Value{arguments[1 ]->force ()}, ResultOptions{});
@@ -147,13 +106,6 @@ namespace runtime::builtins {
147106 name, signature, [name](const std::vector<std::shared_ptr<Thunk> > &arguments,
148107 const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
149108 const Value &argument0 = arguments[0 ]->force ();
150- if (!std::holds_alternative<std::string>(argument0)) {
151- optionsValue.logger .error ({},
152- " runtime error: wrong arguments provided to native function " , name,
153- " \n " , name,
154- " signature: String -> Float\n "
155- " runtime error: expected String got " , argument0);
156- }
157109 const auto &argumentString = std::get<std::string>(argument0);
158110 try {
159111 const double value = std::stod (argumentString);
0 commit comments