03_Table_Operations

Table Operations

What are Element-Wise Operations?

Element-wise operations automatically apply functions to every element in a table without explicit loops or iteration syntax like forEach.

/* Instead of for each element in table, apply function */
/* You write function table */
numbers : {1, 2, 3, 4, 5};
doubled : map @double numbers;  /* {2, 4, 6, 8, 10} */

Most main-stream programming languages require explicit loops or iteration. Baba Yaga takes a clue from array languages like APL, BQN, uiua, K, etc., and automatically handles element-wise operations.

Basic Examples

/* Define a simple function */
double : x -> x * 2;

/* Apply to table elements automatically */
numbers : {1, 2, 3, 4, 5};
result : map @double numbers;
/* Result: {2, 4, 6, 8, 10} */

/* Filter elements automatically */
is_even : x -> x % 2 = 0;
evens : filter @is_even numbers;
/* Result: {2, 4} */

/* Reduce all elements automatically */
sum : reduce @add 0 numbers;
/* Result: 15 (1+2+3+4+5) */

Table-Specific Operations

The t. namespace provides additional element-wise operations especially meant for tables.

/* Table-specific operations */
data : {a: 1, b: 2, c: 3};

/* Get all keys */
keys : t.keys data;  /* {"a", "b", "c"} */

/* Get all values */
values : t.values data;  /* {1, 2, 3} */

/* Get key-value pairs */
pairs : t.pairs data;  /* {{key: "a", value: 1}, {key: "b", value: 2}, {key: "c", value: 3}} */

/* Check if key exists */
has_a : t.has data "a";  /* true */
has_d : t.has data "d";  /* false */

/* Get value by key */
value_a : t.get data "a";  /* 1 */

Complex Examples

/* Data processing pipeline */
data : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

/* Define helper functions */
is_even : x -> x % 2 = 0;
double : x -> x * 2;
sum : x -> reduce @add 0 x;

/* Complete pipeline: filter → map → reduce */
result : sum map double filter is_even data;
/* Step 1: filter @is_even data → {2, 4, 6, 8, 10} */
/* Step 2: map @double {2, 4, 6, 8, 10} → {4, 8, 12, 16, 20} */
/* Step 3: sum {4, 8, 12, 16, 20} → 60 */
/* Result: 60 */

Nested Tables

Element-wise operations work with nested table structures, too

/* Nested table */
people : {
  alice: {name: "Alice", age: 30, scores: {85, 90, 88}},
  bob: {name: "Bob", age: 25, scores: {92, 87, 95}},
  charlie: {name: "Charlie", age: 35, scores: {78, 85, 82}}
};

/* Extract ages */
ages : map (x -> x.age) people;
/* Result: {alice: 30, bob: 25, charlie: 35} */

/* Calculate average scores for each person */
get_average : person -> reduce add 0 person.scores / 3;
averages : map get_average people;
/* Result: {alice: 87.67, bob: 91.33, charlie: 81.67} */

The each Combinator

The each combinator provides multi-argument element-wise operations:

/* each for multi-argument operations */
numbers : {1, 2, 3, 4, 5};
multipliers : {10, 20, 30, 40, 50};

/* Multiply corresponding elements */
result : each @multiply numbers multipliers;
/* Result: {10, 40, 90, 160, 250} */

/* Compare corresponding elements */
is_greater : each @greaterThan numbers {3, 3, 3, 3, 3};
/* Result: {false, false, false, true, true} */

Immutability

All element-wise operations return new tables. In Baba Yaga all values, including tables are immutable.

/* Original table */
original : {a: 1, b: 2, c: 3};

/* Operations return new tables */
doubled : map @double original;  /* {a: 2, b: 4, c: 6} */
greater_then : x -> x > 1;
filtered : filter @greater_then original;  /* {b: 2, c: 3} */

/* Original is unchanged */
/* original is still {a: 1, b: 2, c: 3} */