Files
corelang/main.cpp
2022-05-30 11:10:27 +02:00

75 lines
2.9 KiB
C++

#include "base.cpp"
#include "base_unicode.cpp"
#include "new_lex.cpp"
#include "new_ast.cpp"
#include "new_parse.cpp"
#include "new_resolve.cpp"
#include "ccodegen.cpp"
// 2022.05.28 - On lambda expressions
// I think it's not wise to add the multiline lambda expressions
// As is the case with python it would require new alternative syntax.
// The idea was to imply that the whitespace significant syntax is just
// inserting '{' '}' ';' automatically and if you decide to write a brace
// it stops being whitespace significant and you can type everything with semicolons and braces
// Problem is first of all it's kind of weird to have a completly different syntax
// in a language to solve something that is a minor inconvenience,
// second of all it turned out to be kind of bad, maybe if it would be more
// complicated then it would be ok but it implies that you have to semicolon end
// a lot of thing unintuitively.
//
// Probably single line lambdas should be ok. Currently braces turn off indentation
// awareness. There might be something you can do by trying to turn that on
// problem is that complicates parsing a lot cause you have to account for multiple
// indent styles, which means error messages become bad.
// 2022.05.30 - On constructors and compound expressions
// I unified the compound expression syntax (Type){} with function call syntax Type().
// It's differentiating on whether you used type. I think there is a benefit to the language
// not having an idea of overloading the type constructor. You will always know what will happen.
// Unlike C++ for example. It seems like a minefield that can fuck your mind up. So many corner cases
// and variants. having the idea of compounds doing one thing is reassuring I think.
// You can always do a constructor by writing a function with lower case type if you want that.
// For now I don't thing it should be overloadable.
//
/// @todo
/// [x] - Typespecs should probably be expressions so stuff like would be possible :: *[32]int
/// [x] - Initial order independence algorithm
/// [ ] - Cleanup the mess with constant bindings
/// [ ] - Struct calls
/// [ ] - Default values in calls
/// [ ] - Resolving calls with default values
/// [ ] - Resolving calls with named args, with indexed args
/// [ ] - Structs
/// [ ] - Enums
/// [ ] - For loop
/// [ ] - Switch
/// [ ] - Think about compound expressions, unify with calls - maybe Thing(a=1) instead of Thing{a=1}
/// [ ] - Lexer: Need to insert scope endings when hitting End of file
/// [ ] - Add single line lambda expressions/
int main(){
test_os_memory();
thread_ctx_init();
test_unicode();
test_types();
map_test();
test_array();
test_string_builder();
test_intern_table();
lex_test();
String result = {};
// result = compile_file("order1.kl"_s);
result = compile_file("lambdas.kl"_s);
// result = compile_file("order2.kl"_s);
// result = compile_file("globals.kl"_s);
printf("%s", result.str);
__debugbreak();
}