/* * el_runtime.h — El language C runtime header * * Declares all built-in functions available to compiled El programs. * Include this in every generated .c file. * * Value model: * All El values are represented as el_val_t (= int64_t). * On 64-bit systems a pointer fits in int64_t. * String values are cast: (el_val_t)(uintptr_t)"hello" * Integer values are stored directly. * This lets arithmetic work naturally while still passing strings around. * * Type conventions (El -> C): * String -> el_val_t (holds const char* via uintptr_t cast) * Int -> el_val_t * Bool -> el_val_t (0 = false, nonzero = true) * Any -> el_val_t * Void -> void * * Macros for convenience: * EL_STR(s) cast string literal to el_val_t * EL_CSTR(v) cast el_val_t back to const char* * EL_INT(v) identity — el_val_t is already int64_t */ #pragma once #include #include typedef int64_t el_val_t; #define EL_STR(s) ((el_val_t)(uintptr_t)(s)) #define EL_CSTR(v) ((const char*)(uintptr_t)(v)) #define EL_INT(v) (v) #define EL_NULL ((el_val_t)0) #ifdef __cplusplus extern "C" { #endif /* ── I/O ──────────────────────────────────────────────────────────────────── */ void println(el_val_t s); void print(el_val_t s); el_val_t readline(void); /* ── String builtins ─────────────────────────────────────────────────────── */ el_val_t el_str_concat(el_val_t a, el_val_t b); el_val_t str_eq(el_val_t a, el_val_t b); el_val_t str_starts_with(el_val_t s, el_val_t prefix); el_val_t str_ends_with(el_val_t s, el_val_t suffix); el_val_t str_len(el_val_t s); el_val_t str_concat(el_val_t a, el_val_t b); el_val_t int_to_str(el_val_t n); el_val_t str_to_int(el_val_t s); el_val_t str_slice(el_val_t s, el_val_t start, el_val_t end); el_val_t str_contains(el_val_t s, el_val_t sub); el_val_t str_replace(el_val_t s, el_val_t from, el_val_t to); el_val_t str_to_upper(el_val_t s); el_val_t str_to_lower(el_val_t s); el_val_t str_trim(el_val_t s); /* ── Math ────────────────────────────────────────────────────────────────── */ el_val_t el_abs(el_val_t n); el_val_t el_max(el_val_t a, el_val_t b); el_val_t el_min(el_val_t a, el_val_t b); /* ── List ────────────────────────────────────────────────────────────────── */ el_val_t el_list_new(el_val_t count, ...); el_val_t el_list_len(el_val_t list); el_val_t el_list_get(el_val_t list, el_val_t index); el_val_t el_list_append(el_val_t list, el_val_t elem); el_val_t el_list_empty(void); /* ── Map ─────────────────────────────────────────────────────────────────── */ el_val_t el_map_new(el_val_t pair_count, ...); el_val_t el_get_field(el_val_t map, el_val_t key); el_val_t el_map_get(el_val_t map, el_val_t key); el_val_t el_map_set(el_val_t map, el_val_t key, el_val_t value); /* ── HTTP ─────────────────────────────────────────────────────────────────── */ el_val_t http_get(el_val_t url); el_val_t http_post(el_val_t url, el_val_t body); void http_serve(el_val_t port, el_val_t handler); /* ── Filesystem ──────────────────────────────────────────────────────────── */ el_val_t fs_read(el_val_t path); el_val_t fs_write(el_val_t path, el_val_t content); /* ── JSON ────────────────────────────────────────────────────────────────── */ el_val_t json_get(el_val_t json, el_val_t key); /* ── Process ─────────────────────────────────────────────────────────────── */ void exit_program(el_val_t code); #ifdef __cplusplus } #endif