@@ -5,9 +5,14 @@ namespace runtime::builtins {
55 // Prints Argument to stdout and returns 0.
66 NativeFunction makePrint () {
77 const std::string name = " print" ;
8+ const auto signature = functionType (
9+ {simpleType (type::TypeTag::Any)},
10+ nullptr ,
11+ true
12+ );
813 return {
9- - 1 , name , [](const std::vector<std::shared_ptr<Thunk> > &arguments,
10- const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
14+ name, signature , [](const std::vector<std::shared_ptr<Thunk> > &arguments,
15+ const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
1116 for (auto &argument: arguments) {
1217 const Value &value = argument->force ();
1318 std::cout << value;
@@ -19,9 +24,13 @@ namespace runtime::builtins {
1924
2025 NativeFunction makeAdd () {
2126 const std::string name = " add" ;
27+ const auto signature = functionType (
28+ {simpleType (type::TypeTag::Float), simpleType (type::TypeTag::Float)},
29+ simpleType (type::TypeTag::Float)
30+ );
2231 return {
23- 2 , name , [name](const std::vector<std::shared_ptr<Thunk> > &arguments,
24- const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
32+ name, signature , [name](const std::vector<std::shared_ptr<Thunk> > &arguments,
33+ const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
2534 const Value &value1 = arguments[0 ]->force ();
2635 const Value &value2 = arguments[1 ]->force ();
2736 if (!std::holds_alternative<double >(value1) || !std::holds_alternative<double >(value2)) {
@@ -36,9 +45,13 @@ namespace runtime::builtins {
3645
3746 NativeFunction makeSub () {
3847 const std::string name = " sub" ;
48+ const auto signature = functionType (
49+ {simpleType (type::TypeTag::Float), simpleType (type::TypeTag::Float)},
50+ simpleType (type::TypeTag::Float)
51+ );
3952 return {
40- 2 , name , [name](const std::vector<std::shared_ptr<Thunk> > &arguments,
41- const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
53+ name, signature , [name](const std::vector<std::shared_ptr<Thunk> > &arguments,
54+ const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
4255 const Value &value1 = arguments[0 ]->force ();
4356 const Value &value2 = arguments[1 ]->force ();
4457 if (!std::holds_alternative<double >(value1) || !std::holds_alternative<double >(value2)) {
@@ -53,9 +66,13 @@ namespace runtime::builtins {
5366
5467 NativeFunction makeMul () {
5568 const std::string name = " mul" ;
69+ const auto signature = functionType (
70+ {simpleType (type::TypeTag::Float), simpleType (type::TypeTag::Float)},
71+ simpleType (type::TypeTag::Float)
72+ );
5673 return {
57- 2 , name , [name](const std::vector<std::shared_ptr<Thunk> > &arguments,
58- const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
74+ name, signature , [name](const std::vector<std::shared_ptr<Thunk> > &arguments,
75+ const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
5976 const Value &value1 = arguments[0 ]->force ();
6077 const Value &value2 = arguments[1 ]->force ();
6178 if (!std::holds_alternative<double >(value1) || !std::holds_alternative<double >(value2)) {
@@ -70,9 +87,13 @@ namespace runtime::builtins {
7087
7188 NativeFunction makeCmp () {
7289 const std::string name = " cmp" ;
90+ const auto signature = functionType (
91+ {simpleType (type::TypeTag::Float), simpleType (type::TypeTag::Float)},
92+ simpleType (type::TypeTag::Float)
93+ );
7394 return {
74- 2 , name , [name](const std::vector<std::shared_ptr<Thunk> > &arguments,
75- const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
95+ name, signature , [name](const std::vector<std::shared_ptr<Thunk> > &arguments,
96+ const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
7697 const Value &value1 = arguments[0 ]->force ();
7798 const Value &value2 = arguments[1 ]->force ();
7899 if (!std::holds_alternative<double >(value1) || !std::holds_alternative<double >(value2)) {
@@ -89,9 +110,14 @@ namespace runtime::builtins {
89110
90111 NativeFunction makeIfZero () {
91112 const std::string name = " if_zero" ;
113+ // TODO: The return-type should be either argument-1 or argument-2.
114+ const auto signature = functionType (
115+ {simpleType (type::TypeTag::Float), simpleType (type::TypeTag::Any), simpleType (type::TypeTag::Any)},
116+ simpleType (type::TypeTag::Any)
117+ );
92118 return {
93- 3 , name , [name](const std::vector<std::shared_ptr<Thunk> > &arguments,
94- const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
119+ name, signature , [name](const std::vector<std::shared_ptr<Thunk> > &arguments,
120+ const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
95121 const Value &conditionValue = arguments[0 ]->force ();
96122 if (!std::holds_alternative<double >(conditionValue)) {
97123 optionsValue.logger .error ({}, " runtime error: wrong arguments provided to native function " , name,
@@ -110,9 +136,13 @@ namespace runtime::builtins {
110136
111137 NativeFunction makeParseFloat () {
112138 const std::string name = " parse_float" ;
139+ const auto signature = functionType (
140+ {simpleType (type::TypeTag::String)},
141+ simpleType (type::TypeTag::Float)
142+ );
113143 return {
114- 1 , name , [name](const std::vector<std::shared_ptr<Thunk> > &arguments,
115- const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
144+ name, signature , [name](const std::vector<std::shared_ptr<Thunk> > &arguments,
145+ const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
116146 const Value &argument0 = arguments[0 ]->force ();
117147 if (!std::holds_alternative<std::string>(argument0)) {
118148 optionsValue.logger .error ({},
@@ -121,7 +151,7 @@ namespace runtime::builtins {
121151 " signature: String -> Float\n "
122152 " runtime error: expected String got " , argument0);
123153 }
124- const std::string &argumentString = std::get<std::string>(argument0);
154+ const auto &argumentString = std::get<std::string>(argument0);
125155 try {
126156 const double value = std::stod (argumentString);
127157 return {Value{value}, ResultOptions{}};
0 commit comments