let memSize = 32;
let memory = [0; memSize];
let ip = 0;
let mem_p = 0;
let source = "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.";
// let source = "++++++++++[-].";

fun inc() {
	let mem_v = memory[mem_p];
	mem_v = mem_v + 1;
	if (mem_v > 255) {
		mem_v = 0;
	}
	memory[mem_p] = mem_v;
}

fun dec() {
	let mem_v = memory[mem_p];
	mem_v = mem_v - 1;
	if (mem_v < 0) {
		mem_v = 255;
	}
	memory[mem_p] = mem_v;
}

fun mem_next() {
	mem_p = mem_p + 1;
}

fun mem_prev() {
	mem_p = mem_p - 1;
}

fun out() {
	let c = memory[mem_p];
	print as_string(as_char(c));
}

fun loop_forward() {
	if (memory[mem_p] == 0) {
		let nested_level = 1;
		while (nested_level > 0) {
		 	ip = ip + 1;
			let c = source[ip];
			if (c == "[") {
				nested_level = nested_level + 1;
			}
			if (c == "]") {
				nested_level = nested_level - 1;
			}
		}
	}
}

fun loop_backward() {
	if (memory[mem_p] != 0) {
		let nested_level = 1;
		while (nested_level > 0) {
		 	ip = ip - 1;
			let c = source[ip];
			if (c == "]") {
				nested_level = nested_level + 1;
			}
			if (c == "[") {
				nested_level = nested_level - 1;
			}
		}
	}
}

while (ip < len(source)) {
	let c = source[ip];
	if (c == "+") {
		inc();
	} else if (c == "-") {
		dec();
	} else if (c == "<") {
		mem_prev();
	} else if (c == ">") {
		mem_next();
	} else if (c == "[") {
		loop_forward();
	} else if (c == "]") {
		loop_backward();
	} else if (c == ".") {
		out();
	}
	ip = ip + 1;
}