void lenv_add_builtin(lenv* e, char* name, lbuiltin func){ lval_t* k = lval_sym(name); lval_t* v = lval_fun(func); lenv_put(e, k, v); lval_free(k); lval_free(v); }
struct lval* lval_read(mpc_ast_t* node) { // Upwrap top-level form as a single expression if (strcmp(node->tag, ">") == 0) { return lval_read(node->children[1]); } if (strstr(node->tag, "number")) { return lval_read_num(node->contents); } if (strstr(node->tag, "symbol")) { return lval_sym(node->contents); } if (strstr(node->tag, "bool")) { return lval_read_bool(node->contents); } struct lval* x; if (strstr(node->tag, "sexp")) { x = lval_sexp(); } else if (strstr(node->tag, "qexp")) { x = lval_qexp(); } else { return lval_err("Unexpected node: %s", node->tag); } for (int i = 0; i < node->children_num; i++) { if (read_ignore(node->children[i])) continue; x = lval_add(x, lval_read(node->children[i])); } return x; }
lval * ast_read(mpc_ast_t *t) { int i; lval *x; if (strstr(t->tag, "number")) return ast_read_num(t); if (strstr(t->tag, "symbol")) { if (!strcmp(t->contents, "true")) { return lval_boolean(1); } else if (!strcmp(t->contents, "false")) { return lval_boolean(0); } else { return lval_sym(t->contents); } } if (strstr(t->tag, "string")) { ssize_t sz = strlen(t->contents) + 1 - 2 /* quotes */; char *unescaped = malloc(sz); memcpy(unescaped, t->contents+1, sz); unescaped[sz-1] = '\0'; unescaped = mpcf_unescape(unescaped); x = lval_str(unescaped); free(unescaped); return x; } if (strstr(t->tag, "comment")) return NULL; if (strstr(t->tag, "qexpr")) { x = lval_qexpr(); } else { assert( (strcmp(t->tag, ">") == 0) || strstr(t->tag, "sexpr") ); x = lval_sexpr(); } for (i = 0; i < t->children_num; ++i) { lval *v; if ( (strlen(t->children[i]->contents) == 1) && strstr("(){}", t->children[i]->contents) ) continue; if (!strcmp(t->children[i]->tag, "regex")) continue; v = ast_read(t->children[i]); if(v) lval_append(x, v); } return x; }
lval *lval_read(mpc_ast_t *t) { if (strstr(t->tag, "long")) { return lval_read_long(t); } if (strstr(t->tag, "double")) { return lval_read_double(t); } if (strstr(t->tag, "symbol")) { return lval_sym(t->contents); } lval *x = NULL; if (strcmp(t->tag, ">") == 0) { x = lval_sexpr(); } if (strstr(t->tag, "sexpr")) { x = lval_sexpr(); } if (strstr(t->tag, "qexpr")) { x = lval_qexpr(); } for (int i = 0; i < t->children_num; i++) { mpc_ast_t *child = t->children[i]; char *contents = child->contents; if (strcmp(contents, "(") == 0) { continue; } if (strcmp(contents, ")") == 0) { continue; } if (strcmp(contents, "{") == 0) { continue; } if (strcmp(contents, "}") == 0) { continue; } if (strcmp(child->tag, "regex") == 0) { continue; } x = lval_add(x, lval_read(child)); } return x; }
lval* lval_read(mpc_ast_t* t) { if (strstr(t->tag, "number")) { return lval_read_num(t); } if (strstr(t->tag, "symbol")) { return lval_sym(t->contents); } lval* x = NULL; if (strcmp(t->tag, ">") == 0) { x = lval_sexpr(); } if (strstr(t->tag, "sexpr")) { x = lval_sexpr(); } if (strstr(t->tag, "qexpr")) { x = lval_qexpr(); } for (int i = 0; i < t->children_num; i++) { if (strcmp(t->children[i]->contents, "(") == 0) { continue; } if (strcmp(t->children[i]->contents, ")") == 0) { continue; } if (strcmp(t->children[i]->contents, "}") == 0) { continue; } if (strcmp(t->children[i]->contents, "{") == 0) { continue; } if (strcmp(t->children[i]->tag, "regex") == 0) { continue; } x = lval_add(x, lval_read(t->children[i])); } return x; }
lval* lval_read(mpc_ast_t* t) { /* If Symbol or Number return conversion to that type */ if (strstr(t->tag, "number")) { return lval_read_num(t); } if (strstr(t->tag, "symbol")) { return lval_sym(t->contents); } /* If root (>) or sexpr then create empty list */ lval* x = NULL; if (strcmp(t->tag, ">") == 0) { x = lval_sexpr(); } if (strstr(t->tag, "sexpr")) { x = lval_sexpr(); } /* Fill this list with any valid expression contained within */ for (int i = 0; i < t->children_num; i++) { if (strcmp(t->children[i]->contents, "(") == 0) { continue; } if (strcmp(t->children[i]->contents, ")") == 0) { continue; } if (strcmp(t->children[i]->contents, "}") == 0) { continue; } if (strcmp(t->children[i]->contents, "{") == 0) { continue; } if (strcmp(t->children[i]->tag, "regex") == 0) { continue; } x = lval_add(x, lval_read(t->children[i])); } return x; }
lval *lval_read(mpc_ast_t *t) { // convert symbols and nums to lvals if (strstr(t->tag, "number")) { return lval_read_num(t); } if (strstr(t->tag, "symbol")) { return lval_sym(t->contents); } // if root or sexpr creat empty list lval *x = NULL; if (strcmp(t->tag, ">") == 0) { x = lval_sexpr(); } if (strstr(t->tag, "sexpr")) { x = lval_sexpr(); } if (strstr(t->tag, "qexpr")) { x = lval_qexpr(); } // fill list with any valid expr contained within for (int i = 0; i < t->children_num; i++) { if (strcmp(t->children[i]->contents, "(") == 0) { continue; } if (strcmp(t->children[i]->contents, ")") == 0) { continue; } if (strcmp(t->children[i]->contents, "{") == 0) { continue; } if (strcmp(t->children[i]->contents, "}") == 0) { continue; } if (strcmp(t->children[i]->tag, "regex") == 0) { continue; } x = lval_add(x, lval_read(t->children[i])); } return x; }
void lenv_add_builtin(lenv* e, char* name, lbuiltin func) { lval* k = lval_sym(name); lval* v = lval_builtin(func); lenv_put(e, k, v); lval_del(k); lval_del(v); }