term

sometimes we want to use a term before it even exists. this is time travel.

this language lets you double numbers. and we referred to the "number" term by its id before we even CREATED it.

TRANSLATED:



look. we use the "number" term, and *then* we create it:

const listTerm = new ListTerm([
	new StringTerm("double"),
	new MaybeTerm(new GapTerm()),
	new TermTerm("number"),
])

Term.number = new NumberTerm()

to make this work, change the "term" term to only store the id when you create it.

class TermTerm extends Term {
	constructor(id) {
		super()
		this.id = id
	}
}

give it a method to get its term from its id.

class TermTerm extends Term {
	//...
	term() {
		return Term[this.id]
	}
}

then use it in every single other method.

class TermTerm extends Term {
	//...
	check(text) {
		return this.term().check(text)
	}
	bite(text) {
		return this.term().bite(text)
	}
	travel(text) {
		return this.term().travel(text)
	}
	emit(text) {
		return this.term().emit(text)
	}
	preview(text) {
		return this.term().preview(text)
	}
	digest(text) {
		return this.term().digest(text)
	}
	error(text) {
		return this.term().error(text)
	}
	translate(text) {
		return this.term().translate(text)
	}
	eat(text) {
		return this.term().eat(text)
	}
}

back to the dream