diff --git a/shortcomings.md b/shortcomings.md index 598013d..6b59a1a 100644 --- a/shortcomings.md +++ b/shortcomings.md @@ -1,3 +1,5 @@ - string processing is very primitive, it just checks for f at the beggining, and then adds #, before { if so - no elif -- no lambdas \ No newline at end of file +- no lambdas +- tuples need to be in () +- converts tuples into lists \ No newline at end of file diff --git a/src/codegen.hpp b/src/codegen.hpp index 9af7165..69f7074 100644 --- a/src/codegen.hpp +++ b/src/codegen.hpp @@ -67,7 +67,29 @@ private: else if (auto *assign = dynamic_cast(&stmt)) { write_indent(); - generate_expr(*assign->target); + if (auto *tuple = dynamic_cast(assign->target.get())) + { + for (size_t i = 0; i < tuple->elements.size(); ++i) + { + if (i > 0) + write(", "); + generate_expr(*tuple->elements[i]); + } + } + else if (auto *list = dynamic_cast(assign->target.get())) + { + for (size_t i = 0; i < list->elements.size(); ++i) + { + if (i > 0) + write(", "); + generate_expr(*list->elements[i]); + } + } + else + { + + generate_expr(*assign->target); + } write(" = "); generate_expr(*assign->value); write("\n"); diff --git a/src/parser.y b/src/parser.y index e3cd8c6..e52f5d9 100644 --- a/src/parser.y +++ b/src/parser.y @@ -121,6 +121,8 @@ expr: | expr MULTIPLY expr { $$ = std::make_unique( BinaryOperator(BinaryOperator::MUL), std::move($1), std::move($3)); } | expr MINUS expr { $$ = std::make_unique( BinaryOperator(BinaryOperator::SUB), std::move($1), std::move($3)); } | expr LT expr { $$ = std::make_unique( BinaryOperator(BinaryOperator::LT) , std::move($1), std::move($3)); } + | expr GT expr { $$ = std::make_unique( BinaryOperator(BinaryOperator::GT) , std::move($1), std::move($3)); } + | expr GTE expr { $$ = std::make_unique( BinaryOperator(BinaryOperator::GTE) , std::move($1), std::move($3)); } | expr KW_AND expr { $$ = std::make_unique( BinaryOperator(BinaryOperator::AND) , std::move($1), std::move($3)); } | expr KW_OR expr { $$ = std::make_unique( BinaryOperator(BinaryOperator::OR) , std::move($1), std::move($3)); } | expr LTE expr { $$ = std::make_unique( BinaryOperator(BinaryOperator::LTE) , std::move($1), std::move($3)); } diff --git a/test/ruby/26.in b/test/ruby/26.in index 612fef7..2f7414c 100644 --- a/test/ruby/26.in +++ b/test/ruby/26.in @@ -1,6 +1,6 @@ def find_max_min(numbers): if not numbers: - return None, None + return (None, None) max_num = numbers[0] min_num = numbers[0] @@ -11,7 +11,7 @@ def find_max_min(numbers): if num < min_num: min_num = num - return max_num, min_num + return (max_num, min_num) def reverse_list(items): reversed_items = [] @@ -20,7 +20,7 @@ def reverse_list(items): return reversed_items numbers = [3, 1, 4, 1, 5, 9, 2, 6] -max_val, min_val = find_max_min(numbers) +(max_val, min_val) = find_max_min(numbers) print(f"List: {numbers}") print(f"Max: {max_val}, Min: {min_val}") print(f"Reversed: {reverse_list(numbers)}") diff --git a/test/ruby/26.out b/test/ruby/26.out new file mode 100644 index 0000000..5d0fac0 --- /dev/null +++ b/test/ruby/26.out @@ -0,0 +1,29 @@ +def find_max_min(numbers) + if not numbers + return [None, None] + end + max_num = numbers[0] + min_num = numbers[0] + for num in numbers[1...-1] + if num > max_num + max_num = num + end + if num < min_num + min_num = num + end + end + return [max_num, min_num] +end +def reverse_list(items) + reversed_items = [] + for i in (items.length - 1...- 1).step(- 1) + reversed_items.append(items[i]) + end + return reversed_items +end +numbers = [3, 1, 4, 1, 5, 9, 2, 6] +max_val, min_val = find_max_min(numbers) +print("List: #{numbers}", "\n") +print("Max: #{max_val}, Min: #{min_val}", "\n") +print("Reversed: #{reverse_list(numbers)}", "\n") +print("Original list unchanged: #{numbers}", "\n")