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); }
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!"); }
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); }
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; }
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; }