print("=== Functions Demo ===");
print("");
print("--- Methods in Classes ---");
class Calculator {
Calculator(this) {
}
add(this, a, b) {
return a + b;
}
subtract(this, a, b) {
return a - b;
}
multiply(this, a, b) {
return a * b;
}
divide(this, a, b) {
if (b == 0) {
return 0;
}
return a / b;
}
}
calc = new Calculator();
print("add(5, 3) =", calc.add(5, 3));
print("subtract(10, 4) =", calc.subtract(10, 4));
print("multiply(6, 7) =", calc.multiply(6, 7));
print("divide(20, 4) =", calc.divide(20, 4));
print("");
print("--- Required Parameters ---");
class Greeter {
Greeter(this) {
}
greet(this, name) {
print("Hello,", name + "!");
}
}
greeter = new Greeter();
greeter.greet("Alice");
greeter.greet("Bob");
print("");
print("--- Optional Parameters with Defaults ---");
class ConfigurableGreeter {
ConfigurableGreeter(this) {
}
greet(this, name, greeting = "Hello", punctuation = "!") {
print(greeting + ",", name + punctuation);
}
}
cg = new ConfigurableGreeter();
cg.greet("Alice");
cg.greet("Bob", "Hi");
cg.greet("Charlie", "Hey", "?");
print("");
print("--- Null Default Values ---");
class Formatter {
Formatter(this) {
}
format(this, value, prefix = null, suffix = null) {
result = "";
if (prefix) {
result += prefix;
}
result += str(value);
if (suffix) {
result += suffix;
}
return result;
}
}
fmt = new Formatter();
print("No prefix/suffix:", fmt.format(42));
print("With prefix:", fmt.format(42, "$"));
print("With both:", fmt.format(42, "$", ".00"));
print("");
print("--- Variable Arguments (*args) ---");
class VarArgs {
VarArgs(this) {
}
printAll(this, *args) {
print("Received", len(args), "arguments:");
for (i = 0; i < len(args); i++) {
print(" arg[" + str(i) + "] =", args[i]);
}
}
sum(this, *numbers) {
total = 0;
for (i = 0; i < len(numbers); i++) {
total += numbers[i];
}
return total;
}
first(this, required, *rest) {
print("Required:", required);
print("Rest:", len(rest), "items");
}
}
va = new VarArgs();
va.printAll(1, 2, 3);
va.printAll("a", "b", "c", "d", "e");
print("sum(1,2,3,4,5) =", va.sum(1, 2, 3, 4, 5));
va.first("mandatory", "extra1", "extra2");
print("");
print("--- Keyword Arguments (**kwargs) ---");
class KwArgs {
KwArgs(this) {
}
configure(this, **options) {
print("Configuration options:");
print(" (kwargs captured as dict)");
}
}
kw = new KwArgs();
kw.configure();
print("");
print("--- Return Values ---");
class Math {
Math(this) {
}
square(this, n) {
return n * n;
}
factorial(this, n) {
if (n <= 1) {
return 1;
}
return n * this.factorial(n - 1);
}
abs(this, n) {
if (n < 0) {
return 0 - n;
}
return n;
}
max(this, a, b) {
if (a > b) {
return a;
}
return b;
}
min(this, a, b) {
if (a < b) {
return a;
}
return b;
}
}
math = new Math();
print("square(7) =", math.square(7));
print("factorial(5) =", math.factorial(5));
print("abs(-42) =", math.abs(-42));
print("max(10, 20) =", math.max(10, 20));
print("min(10, 20) =", math.min(10, 20));
print("");
print("--- Recursion ---");
class Recursive {
Recursive(this) {
}
fibonacci(this, n) {
if (n <= 1) {
return n;
}
return this.fibonacci(n - 1) + this.fibonacci(n - 2);
}
gcd(this, a, b) {
if (b == 0) {
return a;
}
return this.gcd(b, a % b);
}
power(this, base, exp) {
if (exp == 0) {
return 1;
}
return base * this.power(base, exp - 1);
}
}
rec = new Recursive();
print("fibonacci(10) =", rec.fibonacci(10));
print("gcd(48, 18) =", rec.gcd(48, 18));
print("power(2, 8) =", rec.power(2, 8));
print("");
print("--- Method Chaining ---");
class StringBuilder {
buffer = "";
StringBuilder(this) {
}
append(this, text) {
this.buffer += text;
return this;
}
appendLine(this, text) {
this.buffer += text + "\n";
return this;
}
toString(this) {
return this.buffer;
}
clear(this) {
this.buffer = "";
return this;
}
}
sb = new StringBuilder();
sb.append("Hello").append(" ").append("World").append("!");
print("Result:", sb.toString());
sb.clear();
sb.appendLine("Line 1").appendLine("Line 2").append("Line 3");
print("Multi-line:");
print(sb.toString());