================================================================================
Basic Operations
================================================================================
num = 1 + 2;
s = "Hello, World!";
result = call();
result2 = call(1,);
result3 = call(
    h=1,
    d=2,
);
math = 8 % 3 * 5 % 7 / 2 % 1;
number_index = [1, 2, 3, 4][3];
named_index = [1, 2, 3, 4].x;
spaced_negation = - 7;
--------------------------------------------------------------------------------

(source_file
  (var_declaration
    (assignment
      (identifier)
      (binary_expression
        (integer)
        (integer))))
  (var_declaration
    (assignment
      (identifier)
      (string)))
  (var_declaration
    (assignment
      (identifier)
      (function_call
        (identifier)
        (arguments))))
  (var_declaration
    (assignment
      (identifier)
      (function_call
        (identifier)
        (arguments
          (integer)))))
  (var_declaration
    (assignment
      (identifier)
      (function_call
        (identifier)
        (arguments
          (assignment
            (identifier)
            (integer))
          (assignment
            (identifier)
            (integer))))))
  (var_declaration
    (assignment
      (identifier)
      (binary_expression
        (binary_expression
          (binary_expression
            (binary_expression
              (binary_expression
                (integer)
                (integer))
              (integer))
            (integer))
          (integer))
        (integer))))
  (var_declaration
    (assignment
      (identifier)
      (index_expression
        (list
          (integer)
          (integer)
          (integer)
          (integer))
        (integer))))
  (var_declaration
    (assignment
      (identifier)
      (dot_index_expression
        (list
          (integer)
          (integer)
          (integer)
          (integer))
        (identifier))))
  (var_declaration
    (assignment
      (identifier)
      (unary_expression
        (integer)))))

================================================================================
Logical Precedence
================================================================================
function side_effect(x) =
    echo(str("side effect ", x));
function truthy_effect(x) =
    side_effect(x) == undef;

bool = true;
int1 = 4;
int2 = 5;
echo(int1 + int2 && bool);
echo(bool && int1 + int2);
echo(side_effect(1) && side_effect(2) || side_effect(3));
echo(truthy_effect(1) || side_effect(2) && side_effect(3));
echo(4 > 5 || true);
echo(true && 4 == 4);
--------------------------------------------------------------------------------

(source_file
  (function_item
    (identifier)
    (parameters
      (parameter
        (identifier)))
    (echo_expression
      (arguments
        (function_call
          (identifier)
          (arguments
            (string)
            (identifier))))))
  (function_item
    (identifier)
    (parameters
      (parameter
        (identifier)))
    (binary_expression
      (function_call
        (identifier)
        (arguments
          (identifier)))
      (undef)))
  (var_declaration
    (assignment
      (identifier)
      (boolean)))
  (var_declaration
    (assignment
      (identifier)
      (integer)))
  (var_declaration
    (assignment
      (identifier)
      (integer)))
  (transform_chain
    (module_call
      (identifier)
      (arguments
        (binary_expression
          (binary_expression
            (identifier)
            (identifier))
          (identifier)))))
  (transform_chain
    (module_call
      (identifier)
      (arguments
        (binary_expression
          (identifier)
          (binary_expression
            (identifier)
            (identifier))))))
  (transform_chain
    (module_call
      (identifier)
      (arguments
        (binary_expression
          (binary_expression
            (function_call
              (identifier)
              (arguments
                (integer)))
            (function_call
              (identifier)
              (arguments
                (integer))))
          (function_call
            (identifier)
            (arguments
              (integer)))))))
  (transform_chain
    (module_call
      (identifier)
      (arguments
        (binary_expression
          (function_call
            (identifier)
            (arguments
              (integer)))
          (binary_expression
            (function_call
              (identifier)
              (arguments
                (integer)))
            (function_call
              (identifier)
              (arguments
                (integer))))))))
  (transform_chain
    (module_call
      (identifier)
      (arguments
        (binary_expression
          (binary_expression
            (integer)
            (integer))
          (boolean)))))
  (transform_chain
    (module_call
      (identifier)
      (arguments
        (binary_expression
          (boolean)
          (binary_expression
            (integer)
            (integer)))))))

================================================================================
Mathematical Precedence
================================================================================
num = 5 + 4 * 3 ^ 2;
--------------------------------------------------------------------------------

(source_file
  (var_declaration
    (assignment
      (identifier)
      (binary_expression
        (integer)
        (binary_expression
          (integer)
          (binary_expression
            (integer)
            (integer)))))))

================================================================================
Function Precedence
================================================================================
identity = function(x) x;
lazy = function(y) identity(y);
eager = (function(z) identity)(4);
adder = function(x, y) x + y;
multiplier = function(x, y) x * y;
indexer = function(v) v[0];
--------------------------------------------------------------------------------

(source_file
  (var_declaration
    (assignment
      (identifier)
      (function_lit
        (parameters
          (parameter
            (identifier)))
        (identifier))))
  (var_declaration
    (assignment
      (identifier)
      (function_lit
        (parameters
          (parameter
            (identifier)))
        (function_call
          (identifier)
          (arguments
            (identifier))))))
  (var_declaration
    (assignment
      (identifier)
      (function_call
        (parenthesized_expression
          (function_lit
            (parameters
              (parameter
                (identifier)))
            (identifier)))
        (arguments
          (integer)))))
  (var_declaration
    (assignment
      (identifier)
      (function_lit
        (parameters
          (parameter
            (identifier))
          (parameter
            (identifier)))
        (binary_expression
          (identifier)
          (identifier)))))
  (var_declaration
    (assignment
      (identifier)
      (function_lit
        (parameters
          (parameter
            (identifier))
          (parameter
            (identifier)))
        (binary_expression
          (identifier)
          (identifier)))))
  (var_declaration
    (assignment
      (identifier)
      (function_lit
        (parameters
          (parameter
            (identifier)))
        (index_expression
          (identifier)
          (integer))))))

================================================================================
Functions and Ternaries
================================================================================
fn = function(x) echo("this is x") x;
echo(fn ? "truthy" : "falsey");
echo(function(y) y ? "first" : "second");
--------------------------------------------------------------------------------

(source_file
  (var_declaration
    (assignment
      (identifier)
      (function_lit
        (parameters
          (parameter
            (identifier)))
        (echo_expression
          (arguments
            (string))
          (identifier)))))
  (transform_chain
    (module_call
      (identifier)
      (arguments
        (ternary_expression
          (identifier)
          (string)
          (string)))))
  (transform_chain
    (module_call
      (identifier)
      (arguments
        (function_lit
          (parameters
            (parameter
              (identifier)))
          (ternary_expression
            (identifier)
            (string)
            (string)))))))

================================================================================
Assert Expressions
================================================================================
x = assert(true, false, "extra1", "extra2") 5;
undef_assert = assert();
parameter_assert = assert(condition=x != 5, message=str("evaluated: ", x));
fn = function(x) assert(x) x;
echo(assert(true) assert(false) true);
--------------------------------------------------------------------------------

(source_file
  (var_declaration
    (assignment
      (identifier)
      (assert_expression
        (arguments
          (boolean)
          (boolean)
          (string)
          (string))
        (integer))))
  (var_declaration
    (assignment
      (identifier)
      (assert_expression
        (arguments))))
  (var_declaration
    (assignment
      (identifier)
      (assert_expression
        (arguments
          (assignment
            (identifier)
            (binary_expression
              (identifier)
              (integer)))
          (assignment
            (identifier)
            (function_call
              (identifier)
              (arguments
                (string)
                (identifier))))))))
  (var_declaration
    (assignment
      (identifier)
      (function_lit
        (parameters
          (parameter
            (identifier)))
        (assert_expression
          (arguments
            (identifier))
          (identifier)))))
  (transform_chain
    (module_call
      (identifier)
      (arguments
        (assert_expression
          (arguments
            (boolean))
          (assert_expression
            (arguments
              (boolean))
            (boolean)))))))
