blob: 9c1f3cb3ba50c373c4b669b41053fda4a475259d [file] [log] [blame]
#include "std.h"
#include <stdlib.h>
value_t l_plus (value_t a, value_t b)
{
if ( !integerp (a) || !integerp (b) )
return nil;
return (((a >> 2) + (b >> 2)) << 2) | INT_TAG;
}
value_t l_minus (value_t a, value_t b)
{
if ( !integerp (a) || !integerp (b) )
return nil;
return (((a >> 2) - (b >> 2)) << 2) | INT_TAG;
}
value_t l_times (value_t a, value_t b)
{
if ( !integerp (a) || !integerp (b) )
return nil;
return (((a >> 2) * (b >> 2)) << 2) | INT_TAG;
}
value_t l_divide (value_t a, value_t b)
{
if ( !integerp (a) || !integerp (b) )
return nil;
return (((a >> 2) / (b >> 2)) << 2) | INT_TAG;
}
value_t l_printval (value_t val)
{
printval (val, 0);
return nil;
}
void add_function (struct environment *env, char *name, void *func, int nargs)
{
struct function *last,
*new = malloc (sizeof (struct function));
last = env->first;
new->prev = last;
new->name = name;
new->nargs = nargs;
new->code_ptr = func;
env->first = new;
}
void load_std (struct environment *env)
{
add_function (env, "+", l_plus, 2);
add_function (env, "-", l_minus, 2);
add_function (env, "*", l_times, 2);
add_function (env, "/", l_divide, 2);
add_function (env, "car", car, 1);
add_function (env, "cdr", cdr, 1);
add_function (env, "cons", cons, 2);
add_function (env, "print", l_printval, 1);
}