void env_insert(lexeme env, lexeme id, lexeme value) { lexeme idInserted = lexeme_make(PAIR); lexeme valueInserted = lexeme_make(PAIR); pair idData = pair_make(id, env_id_list(env)); pair valueData = pair_make(value, env_value_list(env)); lexeme_set_data(idInserted, idData); lexeme_set_data(valueInserted, valueData); env_set_id_list(env, idInserted); env_set_value_list(env, valueInserted); }
lexeme env_extend(lexeme env, lexeme idList, lexeme valueList) { lexeme e = lexeme_make(ENV); // the extended environment lexeme l = lexeme_make(PAIR); // the lists for the environment (id, value) pair top = pair_make(l, env); pair bottom = pair_make(idList, valueList); lexeme_set_data(e, top); lexeme_set_data(l, bottom); return e; }
lexeme env_make() { lexeme e = lexeme_make(ENV); // the extended environment lexeme l = lexeme_make(PAIR); // the lists for the environment (id, value) pair top = pair_make(l, lexeme_make(NIL)); pair bottom = pair_make(lexeme_make(NIL), lexeme_make(NIL)); lexeme_set_data(e, top); lexeme_set_data(l, bottom); return e; }
lexeme env_remove(lexeme env, lexeme id) { lexeme currentEnv = env; lexeme prevIdPairLexeme = lexeme_make(NIL); lexeme prevValuePairLexeme = lexeme_make(NIL); lexeme currentIdPairLexeme = env_id_list(env); lexeme currentValuePairLexeme = env_value_list(env); lexeme nextIdPairLexeme; lexeme nextValuePairLexeme; pair newIdPair; pair newValuePair; lexeme prevId; lexeme prevValue; lexeme currentId; lexeme currentValue; while (lexeme_get_type(currentEnv) != NIL) { currentId = pair_get_left(lexeme_get_data(currentIdPairLexeme)); // if the first thng needs to be removed, just move the head forward if (!strcmp(lexeme_get_data(currentId), lexeme_get_data(id))) { env_set_id_list(env, pair_get_right(lexeme_get_data(currentIdPairLexeme))); env_set_value_list(env, pair_get_right(lexeme_get_data(currentValuePairLexeme))); return lexeme_make(TRUE); } prevIdPairLexeme = currentIdPairLexeme; prevValuePairLexeme = currentValuePairLexeme; currentIdPairLexeme = pair_get_right(lexeme_get_data(currentIdPairLexeme)); currentValuePairLexeme = pair_get_right(lexeme_get_data(currentValuePairLexeme)); while (lexeme_get_type(currentIdPairLexeme) != NIL) { currentId = pair_get_left(lexeme_get_data(currentIdPairLexeme)); currentValue = pair_get_right(lexeme_get_data(currentValuePairLexeme)); prevId = pair_get_left(lexeme_get_data(prevIdPairLexeme)); prevValue = pair_get_left(lexeme_get_data(prevValuePairLexeme)); nextIdPairLexeme = pair_get_right(lexeme_get_data(currentId)); nextValuePairLexeme = pair_get_right(lexeme_get_data(currentValue)); if (!strcmp(lexeme_get_data(currentId), lexeme_get_data(id))) { newIdPair = pair_make(prevId, nextIdPairLexeme); newValuePair = pair_make(prevValue, nextValuePairLexeme); return lexeme_make(TRUE); } currentIdPairLexeme = nextIdPairLexeme; currentValuePairLexeme = nextValuePairLexeme; } currentEnv = env_get_parent(currentEnv); } return lexeme_make(FALSE); }
static Pointer readList(Tokeniser* t) { if (tokeniser_eof(t)) { THROW("Expected ), got EOF"); } Pointer token = tokeniser_token(t); if ((token.type == Type_symbol) && util_streq(symbol_get(token), ")")) { tokeniser_next(t); return nil_make(); } StackIndex carIndex = PUSH(readForm(t)); StackIndex cdrIndex = PUSH(readList(t)); Pointer ret = pair_make(carIndex, cdrIndex); DROP(2); return ret; }
static void lists_set_value(lexeme lists, lexeme value) { assert(lists != NULL); lexeme id = lists_get_id(lists); pair p = pair_make(id, value); lexeme_set_data(lists, p); }