print("=== Objects Demo ==="); print(""); print("--- Object Instantiation ---"); class Point { x = 0; y = 0; Point(this, x, y) { this.x = x; this.y = y; } toString(this) { return "(" + str(this.x) + ", " + str(this.y) + ")"; } distanceFromOrigin(this) { return this.x * this.x + this.y * this.y; } } p1 = new Point(3, 4); p2 = new Point(10, 20); print("Point 1:", p1.toString()); print("Point 2:", p2.toString()); print(""); print("--- Property Access ---"); print("p1.x =", p1.x); print("p1.y =", p1.y); print("p2.x =", p2.x); print("p2.y =", p2.y); print(""); print("--- Property Modification ---"); p1.x = 100; p1.y = 200; print("After modification, p1:", p1.toString()); print(""); print("--- Method Calls ---"); print("p2.distanceFromOrigin():", p2.distanceFromOrigin()); print(""); print("--- Multiple Objects ---"); class Rectangle { width = 0; height = 0; Rectangle(this, w, h) { this.width = w; this.height = h; } area(this) { return this.width * this.height; } perimeter(this) { return 2 * (this.width + this.height); } } rect1 = new Rectangle(5, 10); rect2 = new Rectangle(3, 7); rect3 = new Rectangle(8, 8); print("Rectangle 1: " + str(rect1.width) + "x" + str(rect1.height)); print(" Area:", rect1.area()); print(" Perimeter:", rect1.perimeter()); print("Rectangle 2: " + str(rect2.width) + "x" + str(rect2.height)); print(" Area:", rect2.area()); print(" Perimeter:", rect2.perimeter()); print("Rectangle 3: " + str(rect3.width) + "x" + str(rect3.height)); print(" Area:", rect3.area()); print(" Perimeter:", rect3.perimeter()); print(""); print("--- Object Composition ---"); class Circle { center = null; radius = 0; Circle(this, centerX, centerY, radius) { this.center = new Point(centerX, centerY); this.radius = radius; } describe(this) { print("Circle at", this.center.toString(), "with radius", this.radius); } } circle = new Circle(5, 5, 10); circle.describe(); print("Center x:", circle.center.x); print("Center y:", circle.center.y); print(""); print("--- Object Arrays ---"); class Student { name = ""; grade = 0; Student(this, name, grade) { this.name = name; this.grade = grade; } } students = {}; students.push(new Student("Alice", 95)); students.push(new Student("Bob", 87)); students.push(new Student("Charlie", 92)); students.push(new Student("Diana", 88)); print("Student Grades:"); totalGrade = 0; for (i = 0; i < len(students); i++) { print(" " + students[i].name + ":", students[i].grade); totalGrade += students[i].grade; } average = totalGrade / len(students); print("Average grade:", average); print(""); print("--- Object State ---"); class BankAccount { owner = ""; balance = 0; transactions = null; BankAccount(this, owner, initial) { this.owner = owner; this.balance = initial; this.transactions = {}; this.transactions.push("Initial deposit: " + str(initial)); } deposit(this, amount) { this.balance += amount; this.transactions.push("Deposit: " + str(amount)); } withdraw(this, amount) { if (amount > this.balance) { print("Insufficient funds!"); return 0; } this.balance -= amount; this.transactions.push("Withdrawal: " + str(amount)); return 1; } getStatement(this) { print("=== Account Statement ==="); print("Owner:", this.owner); print("Transactions:"); for (i = 0; i < len(this.transactions); i++) { print(" ", this.transactions[i]); } print("Current Balance:", this.balance); } } account = new BankAccount("John Doe", 1000); account.deposit(500); account.deposit(250); account.withdraw(300); account.withdraw(100); account.getStatement(); print(""); print("--- Object Equality ---"); class Token { type = ""; value = ""; Token(this, type, value) { this.type = type; this.value = value; } equals(this, other) { return this.type == other.type && this.value == other.value; } } t1 = new Token("NUMBER", "42"); t2 = new Token("NUMBER", "42"); t3 = new Token("STRING", "hello"); print("t1 equals t2:", t1.equals(t2)); print("t1 equals t3:", t1.equals(t3)); print(""); print("--- Factory Pattern ---"); class ShapeFactory { ShapeFactory(this) { } createRectangle(this, w, h) { return new Rectangle(w, h); } createSquare(this, size) { return new Rectangle(size, size); } } factory = new ShapeFactory(); rect = factory.createRectangle(4, 6); square = factory.createSquare(5); print("Rectangle area:", rect.area()); print("Square area:", square.area());