Esempio n. 1
0
lval *builtin(lval *v, char *func) {
    if (strcmp("head", func) == 0) {
        return builtin_head(v);
    }
    if (strcmp("tail", func) == 0) {
        return builtin_tail(v);
    }
    if (strcmp("init", func) == 0) {
        return builtin_init(v);
    }
    if (strcmp("join", func) == 0) {
        return builtin_join(v);
    }
    if (strcmp("eval", func) == 0) {
        return builtin_eval(v);
    }
    if (strcmp("list", func) == 0) {
        return builtin_list(v);
    }
    if (strcmp("cons", func) == 0) {
        return builtin_cons(v);
    }
    if (strcmp("len", func) == 0) {
        return builtin_len(v);
    }

    return builtin_op(v, func);
}
Esempio n. 2
0
lval* builtin(lval* a, char* func) {
  if (strcmp("join", func) == 0) { return builtin_join(a); }
  if (strcmp("list", func) == 0) { return builtin_list(a); }
  if (strcmp("eval", func) == 0) { return builtin_eval(a); }
  if (strcmp("tail", func) == 0) { return builtin_tail(a); }
  if (strcmp("head", func) == 0) { return builtin_head(a); }
  if (strstr("+-/*", func)) { return builtin_op(a, func); }
  lval_del(a);
  return lval_err("Unknown Function!");
}
Esempio n. 3
0
lval *builtin(lenv *e, lval *a, char *func)
{
  if (strcmp("eval", func) == 0) { return builtin_eval(e, a); }
  if (strcmp("head", func) == 0) { return builtin_head(e, a); }
  if (strcmp("join", func) == 0) { return builtin_join(e, a); }
  if (strcmp("list", func) == 0) { return builtin_list(e, a); }
  if (strcmp("tail", func) == 0) { return builtin_tail(e, a); }
  if (strstr("+-*%/", func))     { return builtin_op(e, a, func); }
  lval_del(a);
  return lval_err("Unknown function %s", func);
}
Esempio n. 4
0
bval* bval_to_string(bval* v) {
  char buffer[512];

  bval* s = bval_qexpr();

  switch (v->type) {
    case BVAL_STR:    return v;
    case BVAL_SEXPR:  return bval_expr_to_string(v, "(", ")");
    case BVAL_QEXPR:  return bval_expr_to_string(v, "{", "}");
    case BVAL_OK:     return bval_str("ok!");

    case BVAL_FUN:
      if (v->builtin) {
        snprintf(buffer, sizeof(buffer), "<builtin: %s >", v->sym);
        bval_add(s, bval_str(buffer));
      } else {
        bval_add(s, bval_str("(\\ "));
        bval_add(s, bval_to_string(v->formals));
        bval_add(s, bval_str(" "));
        bval_add(s, bval_to_string(v->body));
        bval_add(s, bval_str(")"));
      }
      break;

    case BVAL_NUM:
      if (ceilf(v->num) == v->num) {
        snprintf(buffer, sizeof(buffer), "%i", ((int) v->num));
      } else {
        snprintf(buffer, sizeof(buffer), "%lf", v->num);
      }
      bval_add(s, bval_str(buffer));
      break;

    case BVAL_ERR:
      snprintf(buffer, sizeof(buffer), "Error: %s", v->err);
      bval_add(s, bval_str(buffer));
      break;

    case BVAL_SYM:
      snprintf(buffer, sizeof(buffer), "%s", v->sym);
      bval_add(s, bval_str(buffer));
      break;
  }

  benv* e = benv_new();
  bval* out = builtin_join(e, s);
  benv_del(e);
  return out;
}
Esempio n. 5
0
bval* bval_expr_to_string(bval* v, char* open, char* close) {
  bval* s = bval_qexpr();
  bval_add(s, bval_str(open));

  for (int i = 0; i < v->count; i++) {
    bval_add(s, bval_to_string(v->cell[i]));
    if (i != (v->count - 1)) bval_add(s, bval_str(" "));
  }

  bval_add(s, bval_str(close));
  benv* e = benv_new();
  bval* out = builtin_join(e, s);
  benv_del(e);
  return out;
}