diff --git a/shortcomings.md b/shortcomings.md index 98c2b52..e125f46 100644 --- a/shortcomings.md +++ b/shortcomings.md @@ -3,4 +3,5 @@ - no lambdas - tuples need to be in () - converts tuples into lists -- no += -= *= /= ... \ No newline at end of file +- no default function argument values +- no expressions of type l_bound < value < r_bound \ No newline at end of file diff --git a/src/codegen.hpp b/src/codegen.hpp index 428dfc4..4d7b9a4 100644 --- a/src/codegen.hpp +++ b/src/codegen.hpp @@ -1,6 +1,7 @@ #pragma once #include "ast.hpp" #include +#include // greatly simplified std::string convert_string(std::string input) @@ -28,6 +29,7 @@ class RubyGenerator std::ostringstream output; int indent_level = 0; bool write_contains = false; + std::set class_names; void write_indent() { @@ -215,6 +217,10 @@ private: { output << "def initialize"; } + else if (function_def->name == "__str__") + { + output << "def to_s"; + } else { output << "def " << function_def->name << ""; @@ -259,6 +265,7 @@ private: } else if (auto *class_def = dynamic_cast(&stmt)) { + class_names.insert(class_def->name); write_indent(); output << "class " << class_def->name << "\n"; indent_level++; @@ -431,6 +438,19 @@ private: write(", \"\\n\")"); return; } + else if (class_names.count(func_id->name)) + { + write(func_id->name); + write(".new("); + for (size_t i = 0; i < call->args.size(); i++) + { + if (i > 0) + write(", "); + generate_expr(*call->args[i]); + } + write(")"); + return; + } } generate_expr(*call->func); diff --git a/test/ruby/28.in b/test/ruby/28.in index 467f0b2..2f76ae5 100644 --- a/test/ruby/28.in +++ b/test/ruby/28.in @@ -1,5 +1,5 @@ class BankAccount: - def __init__(self, owner, balance=0): + def __init__(self, owner, balance): self.owner = owner self.balance = balance @@ -10,7 +10,7 @@ class BankAccount: return False def withdraw(self, amount): - if 0 < amount <= self.balance: + if 0 < amount and amount <= self.balance: self.balance -= amount return True return False @@ -19,7 +19,9 @@ class BankAccount: return self.balance def __str__(self): - return f"Account({self.owner}, Balance: ${self.balance:.2f})" + owner = self.owner + balance = self.balance + return f"Account({owner}, Balance: {balance})" account = BankAccount("Alice", 1000) print(account) diff --git a/test/ruby/28.out b/test/ruby/28.out new file mode 100644 index 0000000..9cd2c46 --- /dev/null +++ b/test/ruby/28.out @@ -0,0 +1,36 @@ +class BankAccount + def initialize(owner, balance) + @owner = owner + @balance = balance + end + def deposit(amount) + if amount > 0 + @balance += amount + return true + end + return false + end + def withdraw(amount) + if 0 < amount and amount <= @balance + @balance -= amount + return true + end + return false + end + def get_balance + return @balance + end + def to_s + owner = @owner + balance = @balance + return "Account(#{owner}, Balance: #{balance})" + end +end +account = BankAccount.new("Alice", 1000) +print(account, "\n") +print("Deposit $500: #{account.deposit(500)}", "\n") +print("Balance: $#{account.get_balance()}", "\n") +print("Withdraw $200: #{account.withdraw(200)}", "\n") +print("Balance: $#{account.get_balance()}", "\n") +print("Withdraw $2000: #{account.withdraw(2000)}", "\n") +print("Final balance: $#{account.get_balance()}", "\n") diff --git a/test/ruby/34.in b/test/ruby/34.in new file mode 100644 index 0000000..467f0b2 --- /dev/null +++ b/test/ruby/34.in @@ -0,0 +1,34 @@ +class BankAccount: + def __init__(self, owner, balance=0): + self.owner = owner + self.balance = balance + + def deposit(self, amount): + if amount > 0: + self.balance += amount + return True + return False + + def withdraw(self, amount): + if 0 < amount <= self.balance: + self.balance -= amount + return True + return False + + def get_balance(self): + return self.balance + + def __str__(self): + return f"Account({self.owner}, Balance: ${self.balance:.2f})" + +account = BankAccount("Alice", 1000) +print(account) + +print(f"Deposit $500: {account.deposit(500)}") +print(f"Balance: ${account.get_balance()}") + +print(f"Withdraw $200: {account.withdraw(200)}") +print(f"Balance: ${account.get_balance()}") + +print(f"Withdraw $2000: {account.withdraw(2000)}") +print(f"Final balance: ${account.get_balance()}") \ No newline at end of file