================================================================================
Anonymous Function
================================================================================

() <str> { "Hiya" }

--------------------------------------------------------------------------------

(root
  (statement
    (expression
      (value
        (function
          (type_definition
            (type))
          (block
            (statement
              (expression
                (value
                  (string))))))))))

================================================================================
Function Assignment
================================================================================

foobar = (x <int>, y <int>) <int> {
  x + y
}

--------------------------------------------------------------------------------

(root
  (statement
    (assignment
      (identifier)
      (assignment_operator)
      (statement
        (expression
          (value
            (function
              (identifier)
              (type_definition
                (type))
              (identifier)
              (type_definition
                (type))
              (type_definition
                (type))
              (block
                (statement
                  (expression
                    (math
                      (expression
                        (identifier))
                      (math_operator)
                      (expression
                        (identifier)))))))))))))

================================================================================
Identifier Function Call
================================================================================

foobar("Hiya")

--------------------------------------------------------------------------------

(root
  (statement
    (expression
      (function_call
        (function_expression
          (identifier))
        (expression
          (value
            (string)))))))

================================================================================
Index Function Call
================================================================================

foo:bar("Hiya")

--------------------------------------------------------------------------------

(root
  (statement
    (expression
      (index
        (expression
          (identifier))
        (expression
          (function_call
            (function_expression
              (identifier))
            (expression
              (value
                (string)))))))))

================================================================================
Double Function Call
================================================================================

foobar()("Hiya")

--------------------------------------------------------------------------------

(root
  (statement
    (expression
      (function_call
        (function_expression
          (function_call
            (function_expression
              (identifier))))
        (expression
          (value
            (string)))))))

================================================================================
Anonymous Function Call
================================================================================

(msg <str>) <str> { msg } ("Hiya");

--------------------------------------------------------------------------------

(root
  (statement
    (expression
      (function_call
        (function_expression
          (function
            (identifier)
            (type_definition
              (type))
            (type_definition
              (type))
            (block
              (statement
                (expression
                  (identifier))))))
        (expression
          (value
            (string)))))))

================================================================================
Complex Function Call
================================================================================

foobar(
    "hi"
    42
    {
      x = 1
      y = 2
    }
)

--------------------------------------------------------------------------------

(root
  (statement
    (expression
      (function_call
        (function_expression
          (identifier))
        (expression
          (value
            (string)))
        (expression
          (value
            (integer)))
        (expression
          (value
            (map
              (identifier)
              (statement
                (expression
                  (value
                    (integer))))
              (identifier)
              (statement
                (expression
                  (value
                    (integer)))))))))))

================================================================================
Callback Function Call
================================================================================

x(() <bool> { true })

--------------------------------------------------------------------------------

(root
  (statement
    (expression
      (function_call
        (function_expression
          (identifier))
        (expression
          (value
            (function
              (type_definition
                (type))
              (block
                (statement
                  (expression
                    (value
                      (boolean))))))))))))

================================================================================
Nested Function Call
================================================================================

from_json(read('file.json'))

--------------------------------------------------------------------------------

(root
  (statement
    (expression
      (function_call
        (function_expression
          (identifier
            (built_in_function)))
        (expression
          (function_call
            (function_expression
              (identifier
                (built_in_function)))
            (expression
              (value
                (string)))))))))
