x-engine-c v0.2.13
The C engine for x-lang
Loading...
Searching...
No Matches
core.c File Reference

Core primitives: pair, first, rest, apply, eval, wrap/unwrap, atomic, base. More...

#include "x-prim.h"
#include "x-eval.h"
#include "x-env.h"
#include "x-tco.h"
#include "x-toplevel.h"
#include "x-type/int.h"
#include "x-type/list.h"
#include "x-type/prim.h"
#include "x-type/procedure.h"

Functions

static x_obj_tx_prim_pair (x_obj_t *p_base, x_obj_t *p_args)
 
static x_obj_tx_prim_first (x_obj_t *p_base, x_obj_t *p_args)
 
static x_obj_tx_prim_rest (x_obj_t *p_base, x_obj_t *p_args)
 
static x_obj_tx_prim_apply (x_obj_t *p_base, x_obj_t *p_args)
 
static x_obj_tx_prim_eval (x_obj_t *p_base, x_obj_t *p_args)
 
static x_obj_tx_prim_eval_immediate (x_obj_t *p_base, x_obj_t *p_args)
 
static x_obj_tx_prim_tail_eval (x_obj_t *p_base, x_obj_t *p_args)
 
static x_obj_tx_prim_wrap (x_obj_t *p_base, x_obj_t *p_args)
 
static x_obj_tx_prim_unwrap (x_obj_t *p_base, x_obj_t *p_args)
 
static x_obj_tx_prim_atomic (x_obj_t *p_base, x_obj_t *p_args)
 
static x_obj_tx_prim_base (x_obj_t *p_base, x_obj_t *p_args)
 
x_obj_tx_prim_core_register (x_obj_t *p_base, x_obj_t *p_args)
 

Detailed Description

Core primitives: pair, first, rest, apply, eval, wrap/unwrap, atomic, base.

Author
Jon Ruttan (jonru.nosp@m.ttan.nosp@m.@gmai.nosp@m.l.co.nosp@m.m)

Function Documentation

◆ x_prim_apply()

static x_obj_t * x_prim_apply ( x_obj_t p_base,
x_obj_t p_args 
)
static

Apply a callable to arguments with a trailing argument list. x-lang: (apply f arg1 ... args)

Parameters
p_baseBase (execution context).
p_argsUnevaluated argument list (f arg1 ... args).
Returns
Result of applying f to the combined argument list.
Note
Fexpr: args unevaluated; evaluates args via x_eval_list.
For procedures, sets up env and uses TCO trampoline via x_eval_body_tco.
Prefix args are spliced onto the final tail list: (apply f a b '(c d)) calls f with (a b c d).
See also
x_eval_body_tco, x_callable_apply

◆ x_prim_atomic()

static x_obj_t * x_prim_atomic ( x_obj_t p_base,
x_obj_t p_args 
)
static

Evaluate each expression sequentially, blocking between evaluations. x-lang: (atomic expr ...)

Parameters
p_baseBase (execution context).
p_argsUnevaluated argument list of expressions.
Returns
Result of the last expression evaluated.
Note
Fexpr: args unevaluated; evaluates each expression individually.
Roots remaining args during each eval to protect from GC.

◆ x_prim_base()

static x_obj_t * x_prim_base ( x_obj_t p_base,
x_obj_t p_args 
)
static

Return the current base (execution context) object. x-lang: (base)

Parameters
p_baseBase (execution context).
p_argsUnused.
Returns
The base object itself.

◆ x_prim_core_register()

x_obj_t * x_prim_core_register ( x_obj_t p_base,
x_obj_t p_args 
)

Register core primitives into the environment.

Binds: pair, first, rest, apply, eval, eval!, tail-eval, wrap, unwrap, atomic, base.

Parameters
p_baseBase (execution context).
p_argsUnused.
Returns
The base object.

◆ x_prim_eval()

static x_obj_t * x_prim_eval ( x_obj_t p_base,
x_obj_t p_args 
)
static

Evaluate an expression, optionally in a given environment. x-lang: (eval expr [env])

Parameters
p_baseBase (execution context).
p_argsUnevaluated argument list (expr [env]).
Returns
Result of evaluation (with env), or NULL (without env, uses TCO).
Note
Fexpr: args unevaluated; x_eargs evaluates expr.
With env arg: makes that environment current for the evaluation and puts the caller's back after. A def inside binds in the given environment and stays bound: the environment is a value, and the binding is in it.
Without env arg: sets tco_expr for tail-call optimization trampoline.
See also
x_prim_eval_immediate, x_prim_tail_eval

◆ x_prim_eval_immediate()

static x_obj_t * x_prim_eval_immediate ( x_obj_t p_base,
x_obj_t p_args 
)
static

Evaluate expression immediately in the current environment. x-lang: (eval! expr)

Parameters
p_baseBase (execution context).
p_argsUnevaluated argument list (expr).
Returns
Result of evaluating expr.
Note
Fexpr: args unevaluated; x_eargs evaluates expr.
No TCO. Evaluates AS A TOP-LEVEL FORM (x_toplevel_enter): the REPL calls this from inside its own frames, and a def the user types must bind globally. Used by the x-lang REPL and the loaders a lang writes over it.
See also
x_prim_eval

◆ x_prim_first()

static x_obj_t * x_prim_first ( x_obj_t p_base,
x_obj_t p_args 
)
static

Return the first element of a pair. x-lang: (first x)

Parameters
p_baseBase (execution context).
p_argsUnevaluated argument list (x).
Returns
First element of pair x.
Note
Fexpr: args unevaluated; x_eargs evaluates them.

◆ x_prim_pair()

static x_obj_t * x_prim_pair ( x_obj_t p_base,
x_obj_t p_args 
)
static

Construct a pair from two values. x-lang: (pair a b)

Parameters
p_baseBase (execution context).
p_argsUnevaluated argument list (a b).
Returns
New pair (a . b).
Note
Fexpr: args unevaluated; x_eargs evaluates them.

◆ x_prim_rest()

static x_obj_t * x_prim_rest ( x_obj_t p_base,
x_obj_t p_args 
)
static

Return the rest (tail) of a pair. x-lang: (rest x)

Parameters
p_baseBase (execution context).
p_argsUnevaluated argument list (x).
Returns
Rest element of pair x.
Note
Fexpr: args unevaluated; x_eargs evaluates them.

◆ x_prim_tail_eval()

static x_obj_t * x_prim_tail_eval ( x_obj_t p_base,
x_obj_t p_args 
)
static

TCO-compatible eval: set expression and environment for tail-call trampoline. x-lang: (tail-eval expr env)

Parameters
p_baseBase (execution context).
p_argsUnevaluated argument list (expr env).
Returns
NULL (result delivered via tco_expr trampoline).
Note
Fexpr: args unevaluated; x_eargs evaluates both args.
Sets tco_expr for tail-call; switches env to the given environment.
See also
x_prim_eval

◆ x_prim_unwrap()

static x_obj_t * x_prim_unwrap ( x_obj_t p_base,
x_obj_t p_args 
)
static

Extract the underlying combiner from an applicative. x-lang: (unwrap applicative)

Parameters
p_baseBase (execution context).
p_argsUnevaluated argument list (applicative).
Returns
The underlying combiner.
Note
Fexpr: args unevaluated; x_eargs evaluates applicative.
See also
x_prim_wrap

◆ x_prim_wrap()

static x_obj_t * x_prim_wrap ( x_obj_t p_base,
x_obj_t p_args 
)
static

Wrap a combiner to create an applicative (args evaluated before call). x-lang: (wrap combiner)

Parameters
p_baseBase (execution context).
p_argsUnevaluated argument list (combiner).
Returns
New applicative wrapping the given combiner.
Note
Fexpr: args unevaluated; x_eargs evaluates combiner.
See also
x_prim_unwrap