Add built-in functions to exit the program and format floats as strings.
This commit is contained in:
parent
dcacdecfff
commit
8ba3fa0860
25
builtin.c
25
builtin.c
|
|
@ -2,6 +2,7 @@
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include "gc.h"
|
#include "gc.h"
|
||||||
|
|
@ -23,6 +24,8 @@ static void bi_display(interp_state_t *state);
|
||||||
static void bi_register_finalizer(interp_state_t *state);
|
static void bi_register_finalizer(interp_state_t *state);
|
||||||
static void bi_current_context(interp_state_t *state);
|
static void bi_current_context(interp_state_t *state);
|
||||||
static void bi_call_with_context(interp_state_t *state);
|
static void bi_call_with_context(interp_state_t *state);
|
||||||
|
static void bi_exit(interp_state_t *state);
|
||||||
|
static void bi_float_to_string(interp_state_t *state);
|
||||||
|
|
||||||
void builtin_init(void)
|
void builtin_init(void)
|
||||||
{
|
{
|
||||||
|
|
@ -58,6 +61,10 @@ void builtin_init(void)
|
||||||
|
|
||||||
register_builtin(BI_CURRENT_CONTEXT, make_builtin_fn(bi_current_context));
|
register_builtin(BI_CURRENT_CONTEXT, make_builtin_fn(bi_current_context));
|
||||||
register_builtin(BI_CALL_WITH_CONTEXT, make_builtin_fn(bi_call_with_context));
|
register_builtin(BI_CALL_WITH_CONTEXT, make_builtin_fn(bi_call_with_context));
|
||||||
|
|
||||||
|
register_builtin(BI_EXIT, make_builtin_fn(bi_exit));
|
||||||
|
|
||||||
|
register_builtin(BI_FLOAT_TO_STRING, make_builtin_fn(bi_float_to_string));
|
||||||
}
|
}
|
||||||
|
|
||||||
void register_builtin(const char *name, value_t value)
|
void register_builtin(const char *name, value_t value)
|
||||||
|
|
@ -227,4 +234,22 @@ static void bi_call_with_context(interp_state_t *state)
|
||||||
state->kw_vals.value = NIL;
|
state->kw_vals.value = NIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void bi_exit(interp_state_t *state)
|
||||||
|
{
|
||||||
|
state->ctx.value = NIL;
|
||||||
|
state->lambda.value = END_PROGRAM;
|
||||||
|
state->kw_args.value = NIL;
|
||||||
|
state->kw_vals.value = NIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bi_float_to_string(interp_state_t *state)
|
||||||
|
{
|
||||||
|
char buffer[32];
|
||||||
|
native_float_t flt = get_float(CAR(state->argv.value));
|
||||||
|
|
||||||
|
snprintf(buffer, sizeof buffer, "%.18g", (double)flt);
|
||||||
|
|
||||||
|
interp_return_values(state, cons(string_to_value(buffer), NIL));
|
||||||
|
}
|
||||||
|
|
||||||
/* vim:set sw=2 expandtab: */
|
/* vim:set sw=2 expandtab: */
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,8 @@
|
||||||
#define BI_DISPLAY "display"
|
#define BI_DISPLAY "display"
|
||||||
#define BI_CURRENT_CONTEXT "current-context"
|
#define BI_CURRENT_CONTEXT "current-context"
|
||||||
#define BI_CALL_WITH_CONTEXT "call-with-context"
|
#define BI_CALL_WITH_CONTEXT "call-with-context"
|
||||||
|
#define BI_EXIT "exit"
|
||||||
|
#define BI_FLOAT_TO_STRING "float->string"
|
||||||
|
|
||||||
/* Lambda: Instances of this structure are fundamental callable objects. */
|
/* Lambda: Instances of this structure are fundamental callable objects. */
|
||||||
#define LAMBDA_SLOT_GLOBAL_VARS 0
|
#define LAMBDA_SLOT_GLOBAL_VARS 0
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue