Skip to content
This repository was archived by the owner on Oct 12, 2026. It is now read-only.

Commit a3d98e4

Browse files
committed
feat: remove redundent type checks in builtins
1 parent dd7847d commit a3d98e4

7 files changed

Lines changed: 53 additions & 171 deletions

File tree

‎include/lbd/runtime/builtin-modules/builtin_module_core.h‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
#include <lbd/runtime/builtins.h>
44

55
namespace runtime::builtins {
6-
NativeFunction makePrint();
7-
86
NativeFunction makeAdd();
97

108
NativeFunction makeSub();

‎include/lbd/runtime/builtin-modules/builtin_module_io.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#include <lbd/runtime/builtins.h>
44

55
namespace runtime::builtins {
6+
NativeFunction makePrint();
7+
68
NativeFunction makeSlurpFile();
79

810
NativeFunction makeLines();

‎include/lbd/runtime/builtins.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,6 @@ namespace runtime::builtins {
1919

2020
// TODO: Generate the SIGNATURE documentation on-demand, rather than editing it manually.
2121

22+
/// Type-Checking of native-function's signature must be handled by the user.
2223
std::vector<NativeFunction> getBuiltins(context::Options options_ = {});
2324
}

‎src/runtime/builtin-modules/builtin_module_core.cpp‎

Lines changed: 10 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,17 @@
22
#include <lbd/utils/string_escape.h>
33

44
namespace 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);

‎src/runtime/builtin-modules/builtin_module_io.cpp‎

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,25 @@
33
#include <lbd/runtime/builtin-modules/builtin_module_io.h>
44

55
namespace runtime::builtins {
6-
// TODO: Move print to io module.
6+
// Prints Argument to stdout and returns 0.
7+
NativeFunction makePrint() {
8+
const std::string name = "print";
9+
const auto signature = functionType(
10+
{simpleType(type::TypeTag::Any)},
11+
nullptr,
12+
true
13+
);
14+
return {
15+
name, signature, [](const std::vector<std::shared_ptr<Thunk> > &arguments,
16+
const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
17+
for (auto &argument: arguments) {
18+
const Value &value = argument->force();
19+
std::cout << value;
20+
}
21+
return std::make_pair(Value{static_cast<double>(0)}, ResultOptions{.sideEffects = true});
22+
}
23+
};
24+
}
725

826
NativeFunction makeSlurpFile() {
927
const std::string name = "slurp_file";
@@ -12,15 +30,9 @@ namespace runtime::builtins {
1230
simpleType(type::TypeTag::String)
1331
);
1432
return {
15-
name, signature, [name](const std::vector<std::shared_ptr<Thunk> > &arguments,
16-
const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
33+
name, signature, [](const std::vector<std::shared_ptr<Thunk> > &arguments,
34+
const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
1735
const Value &argument0 = arguments[0]->force();
18-
if (!std::holds_alternative<std::string>(argument0)) {
19-
optionsValue.logger.error({},
20-
"runtime error: wrong arguments provided to native function ", name,
21-
"\n", name, " signature: String -> String\n"
22-
"runtime error: expected <String> got ", argument0);
23-
}
2436
const auto &path = std::get<std::string>(argument0);
2537
std::ifstream file(path, std::ios::in | std::ios::binary);
2638
if (!file) optionsValue.logger.error({}, "runtime error: could not open file ", path);
@@ -38,15 +50,9 @@ namespace runtime::builtins {
3850
listType()
3951
);
4052
return {
41-
name, signature, [name](const std::vector<std::shared_ptr<Thunk> > &arguments,
42-
const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
53+
name, signature, [](const std::vector<std::shared_ptr<Thunk> > &arguments,
54+
const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
4355
const Value &argument0 = arguments[0]->force();
44-
if (!std::holds_alternative<std::string>(argument0)) {
45-
optionsValue.logger.error({},
46-
"runtime error: wrong arguments provided to native function ", name,
47-
"\n", name, " signature: String -> List<String>\n"
48-
"runtime error: expected <String> got ", argument0);
49-
}
5056
const auto input = std::get<std::string>(argument0);
5157
// Normalize all line endings to '\n'
5258
std::string normalized;
@@ -65,10 +71,12 @@ namespace runtime::builtins {
6571
normalized.push_back(input[i]);
6672
}
6773
}
68-
std::istringstream stream(normalized);
74+
std::istringstream inputStringStream(normalized);
6975
std::string line;
7076
std::vector<Value> result;
71-
while (std::getline(stream, line, '\n')) result.emplace_back(line);
77+
while (std::getline(inputStringStream, line, '\n')) {
78+
result.emplace_back(line);
79+
}
7280
return {Value{std::make_shared<List>(std::move(result))}, ResultOptions{}};
7381
}
7482
};
@@ -84,19 +92,7 @@ namespace runtime::builtins {
8492
name, signature, [name](const std::vector<std::shared_ptr<Thunk> > &arguments,
8593
const std::shared_ptr<Environment> &) -> std::pair<Value, ResultOptions> {
8694
const Value &argument0 = arguments[0]->force(); // string
87-
if (!std::holds_alternative<std::string>(argument0)) {
88-
optionsValue.logger.error({}, "runtime error: wrong arguments provided to native function ", name,
89-
"\n", name,
90-
" signature: String -> String -> List<String>""\n"
91-
"runtime error: expected <String> got ", argument0);
92-
}
9395
const Value &argument1 = arguments[1]->force(); // delimiter
94-
if (!std::holds_alternative<std::string>(argument1)) {
95-
optionsValue.logger.error({}, "runtime error: wrong arguments provided to native function ", name,
96-
"\n", name,
97-
" signature: String -> String -> List""\n"
98-
"runtime error: expected <String> got ", argument1);
99-
}
10096
const auto &input = std::get<std::string>(argument0);
10197
const auto &delimiter = std::get<std::string>(argument1);
10298
if (delimiter.empty()) {

0 commit comments

Comments
 (0)