#ifndef ECLISP_WRAPPER_H
#define ECLISP_WRAPPER_H
#include <ecl/ecl.h>
#include <stdint.h>
enum {
ECLISP_OK = 0,
ECLISP_ERROR = 1,
ECLISP_ALLOCATION_FAILED = 2,
ECLISP_INVALID_ARGUMENT = -1
};
typedef struct {
cl_object object;
} eclisp_root;
eclisp_root *eclisp_root_new(cl_object object);
cl_object eclisp_root_get(const eclisp_root *root);
int eclisp_root_copy(cl_object object, eclisp_root **out);
void eclisp_root_free(eclisp_root *root);
int eclisp_eval(const char *source, eclisp_root **out_root, char **out_error);
int eclisp_call(
const char *function,
size_t argc,
const cl_object *argv,
eclisp_root **out_root,
char **out_error
);
typedef int (*eclisp_callback)(
size_t callback_id,
cl_object arguments,
eclisp_root **out_result,
char *error,
size_t error_capacity
);
int eclisp_register_dispatcher(eclisp_callback callback);
int eclisp_args_length(cl_object arguments, size_t *out_length);
int eclisp_args_get(cl_object arguments, size_t index, cl_object *out);
int eclisp_function_get(
const char *name,
eclisp_root **out_root,
char **out_error
);
int eclisp_function_call(
cl_object function,
size_t argc,
const cl_object *argv,
eclisp_root **out_root,
char **out_error
);
int eclisp_nil_new(eclisp_root **out);
int eclisp_t_new(eclisp_root **out);
int eclisp_int_new(int64_t value, eclisp_root **out);
int eclisp_float_new(double value, eclisp_root **out);
int eclisp_cons_new(cl_object car, cl_object cdr, eclisp_root **out);
int eclisp_list_new(size_t length, const cl_object *values, eclisp_root **out);
int eclisp_string_new(const char *text, size_t length, eclisp_root **out_root);
void eclisp_string_free(char *string);
int eclisp_is_nil(cl_object object);
int eclisp_is_t(cl_object object);
int eclisp_is_int(cl_object object);
int eclisp_is_float(cl_object object);
int eclisp_is_string(cl_object object);
int eclisp_is_cons(cl_object object);
int eclisp_is_list(cl_object object);
int eclisp_as_int(cl_object object, int64_t *out);
int eclisp_as_float(cl_object object, double *out);
int eclisp_as_string(cl_object object, char **out, size_t *out_length);
int eclisp_repr(cl_object object, char **out_repr);
int eclisp_car(cl_object object, eclisp_root **out_car);
int eclisp_cdr(cl_object object, eclisp_root **out_cdr);
#endif