Beispiel #1
0
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);
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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);
}
Beispiel #5
0
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;
}
Beispiel #6
0
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);
}