Built-in Functions (Not a Library)

L4 includes several built-in functions that are always available without importing any library. These are implemented in the compiler core.

For operators (arithmetic, comparison, boolean), see also Operators for precedence and usage details.

Type Coercion Builtins

Function Signature Description
TOSTRING NUMBER/BOOLEAN/DATE/TIME/DATETIME → STRING Convert to string representation
TONUMBER STRING → MAYBE NUMBER Parse string to number
TODATE STRING → MAYBE DATE Parse string to date
TOTIME STRING → MAYBE TIME Parse string to time
TODATETIME STRING → MAYBE DATETIME Parse string to datetime
TRUNC NUMBER → NUMBER → NUMBER Truncate decimal places
AS STRING value AS STRING Inline string conversion

Numeric Builtins

Function Signature Description
IS INTEGER NUMBER → BOOLEAN TRUE if the number has no fractional part
FLOOR NUMBER → NUMBER Round down to integer
CEILING NUMBER → NUMBER Round up to integer
ROUND NUMBER → NUMBER Round to nearest integer
EXPONENT NUMBER → NUMBER → NUMBER Exponentiation (base, power)
LN NUMBER → NUMBER Natural logarithm (runtime error if x ≤ 0)
LOG10 NUMBER → NUMBER Base-10 logarithm (runtime error if x ≤ 0)
SQRT NUMBER → NUMBER Square root
SIN, COS, TAN NUMBER → NUMBER Trigonometric functions (radians)
ASIN, ACOS NUMBER → NUMBER Inverse trigonometric (runtime error outside [-1, 1])
ATAN NUMBER → NUMBER Inverse tangent

The math library provides safe lowercase wrappers (ln, sqrt, asin, ...) that return MAYBE NUMBER instead of raising runtime errors on domain violations.

String Builtins

Function Signature Description
STRINGLENGTH STRING → NUMBER Length of string
TOUPPER STRING → STRING Convert to uppercase
TOLOWER STRING → STRING Convert to lowercase
TRIM STRING → STRING Remove leading/trailing whitespace
CONTAINS STRING → STRING → BOOLEAN Substring test
STARTSWITH STRING → STRING → BOOLEAN Prefix test
ENDSWITH STRING → STRING → BOOLEAN Suffix test
INDEXOF STRING → STRING → NUMBER Find position of substring
SPLIT STRING → STRING → LIST OF STRING Split by delimiter
CHARAT STRING → NUMBER → STRING Character at index
SUBSTRING STRING → NUMBER → NUMBER → STRING Substring (string, start, length)
REPLACE STRING → STRING → STRING → STRING Replace occurrences (string, old, new)
CONCAT x, y, ... STRING → ... → STRING Concatenate multiple strings

Note: STARTSWITH and ENDSWITH are single tokens (no space).

Date Builtins

Function Signature Description
DATE_FROM_DMY NUMBER → NUMBER → NUMBER → DATE Construct DATE from day, month, year
DATE_FROM_SERIAL NUMBER → DATE Construct DATE from serial number
DATE_SERIAL DATE → NUMBER Get serial number from DATE
DATE_DAY DATE → NUMBER Extract day from DATE
DATE_MONTH DATE → NUMBER Extract month from DATE
DATE_YEAR DATE → NUMBER Extract year from DATE
DATEVALUE STRING → EITHER STRING DATE Parse date text (LEFT is error message)
TODAY DATE Current date (requires TIMEZONE IS)

Time Builtins

Function Signature Description
TIME_HOUR TIME → NUMBER Extract hour (0-23)
TIME_MINUTE TIME → NUMBER Extract minute (0-59)
TIME_SECOND TIME → NUMBER Extract second (0-59)
TIME_SERIAL TIME → NUMBER Get serial number (day fraction) from TIME
TIME_FROM_SERIAL NUMBER → TIME Construct TIME from day fraction
TIME_FROM_HMS NUMBER → NUMBER → NUMBER → TIME Construct TIME from hour, minute, second
TIMEVALUE STRING → EITHER STRING NUMBER Parse time text to day fraction (LEFT is error)
CURRENTTIME TIME Current local time (requires TIMEZONE IS)

DateTime Builtins

Function Signature Description
DATETIME_DATE DATETIME → DATE Extract the date part
DATETIME_TIME DATETIME → TIME Extract the time-of-day part
DATETIME_TZ DATETIME → STRING Extract the IANA timezone name
DATETIME_SERIAL DATETIME → NUMBER Get UTC serial number from DATETIME
DATETIME_FROM_DTZ DATE → TIME → STRING → DATETIME Construct from date, time, and IANA timezone name
NOW DATETIME Current date and time (defaults to UTC without TIMEZONE IS)

Timezone Builtins

Function Signature Description
TIMEZONE STRING Returns the document timezone string (requires TIMEZONE IS)
TIMEZONE IS declaration Top-level declaration setting the document timezone

Temporal and Bitemporal Builtins

These builtins interact with L4's temporal evaluation context. Days are scanned inclusively; while a predicate is evaluated for a day, the valid time and rules-effective date are set to that day.

Function Signature Description
EVER BETWEEN DATE → DATE → (DATE → BOOLEAN) → BOOLEAN TRUE if the predicate holds on any day from start to end (inclusive). FALSE when start is after end.
ALWAYS BETWEEN DATE → DATE → (DATE → BOOLEAN) → BOOLEAN TRUE if the predicate holds on every day from start to end (inclusive). Vacuously TRUE when start is after end.
WHEN LAST DATE → (DATE → BOOLEAN) → MAYBE DATE Most recent day at or before the given date on which the predicate holds; NOTHING if none is found.
WHEN NEXT DATE → (DATE → BOOLEAN) → MAYBE DATE Earliest day at or after the given date on which the predicate holds (searching up to 9999-12-31); NOTHING if none.
VALUE AT DATE → (DATE → a) → a Evaluates the function at the given date, with valid time and rules-effective date set to that date.

Example (see temporal-acceptance.l4):

#EVAL `EVER BETWEEN` (Date 5 1 2024) (Date 7 1 2024) `weekend?`
#EVAL `WHEN NEXT` (Date 10 1 2024) `weekend?`
#EVAL `VALUE AT` (Date 4 7 1776) (GIVEN d YIELD d)

The EVAL ... builtins re-evaluate an expression under an altered temporal context, then restore the original context. The first argument is a date/time serial number (see DATE_SERIAL, DATETIME_SERIAL); the second is the expression to evaluate.

Function Signature Description
EVAL AS OF SYSTEM TIME NUMBER → a → a Evaluate as if the system (transaction) time were the given serial timestamp
EVAL UNDER VALID TIME NUMBER → a → a Evaluate with the valid time set to the given date serial
EVAL UNDER RULES EFFECTIVE AT NUMBER → a → a Evaluate under the version of the rules effective at the given date
EVAL UNDER RULES ENCODED AT NUMBER → a → a Evaluate under the rules as they were encoded (known) at the given timestamp

For regulative traces, WAIT UNTIL produces a synthetic event that matches no party or action and is only relevant for its timestamp — use it to advance time in an event list:

Function Signature Description
WAIT UNTIL NUMBER → EVENT a b Event that advances contract time to the given timestamp
#TRACE aContract AT 0 WITH
  PARTY S DOES delivery AT 2
  (`WAIT UNTIL` 10)

See Regulative Rules and EVENT for details.

Arithmetic Operators

These operators are always available without import.

Operator Text Alias Signature Description
+ PLUS NUMBER → NUMBER → NUMBER Addition
- MINUS NUMBER → NUMBER → NUMBER Subtraction
* TIMES NUMBER → NUMBER → NUMBER Multiplication
/ DIVIDED BY NUMBER → NUMBER → NUMBER Division
MODULO -- NUMBER → NUMBER → NUMBER Remainder
EXPONENT -- NUMBER → NUMBER → NUMBER Exponentiation
FLOOR -- NUMBER → NUMBER Round down to integer
CEILING -- NUMBER → NUMBER Round up to integer
TRUNC -- NUMBER → NUMBER → NUMBER Truncate toward zero

Comparison Operators

Operator Text Alias Signature Description
= EQUALS a → a → BOOLEAN Equality (not assignment)
> GREATER THAN a → a → BOOLEAN Greater than
< LESS THAN a → a → BOOLEAN Less than
>= AT LEAST a → a → BOOLEAN Greater than or equal
<= AT MOST a → a → BOOLEAN Less than or equal

Note: = is equality, NOT assignment. L4 has no assignment (pure functional).

Boolean Operators

Operator Symbol Alias Precedence Description
NOT -- Highest Logical negation
AND && High Logical and
OR || Medium Logical or
IMPLIES => Lowest Logical implication
UNLESS -- = AND NOT Shorthand for AND NOT

List Construction

Syntax Description
LIST x, y, z Literal list
EMPTY Empty list
x FOLLOWED BY xs Cons (prepend)

Nullary Builtins

Function Type Description
TODAY DATE Current date in document timezone
NOW DATETIME Current date and time (defaults to UTC without TIMEZONE IS)
CURRENTTIME TIME Current local time (requires TIMEZONE IS)
TIMEZONE STRING Document timezone (IANA name)

HTTP and JSON Builtins

Function Signature Description
FETCH STRING → STRING HTTP GET request
POST STRING, STRING, STRING → STRING HTTP POST request
ENV STRING → MAYBE STRING Read environment variable
JSONENCODE a → STRING Convert value to JSON string
JSONDECODE STRING → EITHER STRING a Parse JSON string to value

For detailed HTTP/JSON documentation, see HTTP and JSON.

For detailed coercion documentation, see Coercions.