// returns a c string representation for the given LValue // (be sure to free the string when you're done) char *l_str(LValue *value) { char *str; stringbuf *str2; switch(value->type) { case L_NUM_TYPE: str = mpz_get_str(NULL, 10, value->core.num); break; case L_STR_TYPE: str = GC_MALLOC(sizeof(char) * (value->core.str->length + 1)); strcpy(str, value->core.str->str); break; case L_LIST_TYPE: str2 = make_stringbuf("["); char *s; int i, len = value->core.list->length; for(i=0; i<len; i++) { s = l_str(l_list_get(value, i)); concat_stringbuf(str2, s); if(i<len-1) buffer_concat(str2, " "); } buffer_concat(str2, "]"); str = GC_MALLOC(sizeof(char) * (str2->length + 1)); strcpy(str, str2->str); destroy_buffer(str2); break; case L_TRUE_TYPE: str = GC_MALLOC(sizeof(char) * 5); strcpy(str, "true"); break; case L_FALSE_TYPE: str = GC_MALLOC(sizeof(char) * 6); strcpy(str, "false"); break; case L_NIL_TYPE: str = GC_MALLOC(sizeof(char) * 4); strcpy(str, "nil"); break; default: str = GC_MALLOC(sizeof(char) * 1); strcpy(str, ""); } return str; }
LValue *l_eval_var_node(LNode *node, LClosure *closure) { LValue *value = l_closure_get(closure, node->val); if(value != NULL) { return value; } else { value = l_value_new(L_ERR_TYPE, closure); value->core.str = make_stringbuf(node->val); buffer_concat(value->core.str, " not found"); l_handle_error(value, node, closure); return value; } }