I7: Tables and functional programming

Well, that’s not right either, because I forgot that properties’ and attributes’ numbers can coincide. For instance,

There is a room.
To decide what number is description converted to a number: (- description -).
To decide what number is locked converted to a number: (- locked -).

When play begins:
	showme description converted to a number;
	showme locked converted to a number.

So best to stick to non-attributes, I guess:

Section "Setup"

To decide what number is (V - a value) converted to a number: (- {V} -).

To decide whether (O - an object) has property number (P - a number): (- WhetherProvides({O},0,{P}) -).

To store non-block value (V - a value) as property number (P - a number) in (O - an object): (- {O}.{P}={V}; -).
To store block value (V - a value) as property number (P - a number) in (O - an object): (- BlkValueCopy(GProperty(OBJECT_TY,{O},{P}),{V}); -).

To decide what number is the number of columns in (T - a table name): (- ({T}-->0) -).
To decide what number is table column (I - a number) in (T - a table name): (- ((({T}-->{I})-->1)&TB_COLUMN_NUMBER) -).
To decide whether table column (C - a number) is a block-value table column: (- KOVIsBlockValue(TC_KOV({C})) -)

To decide whether there is a value at row (R - a number) and column (C - a number) in (T - a table name): (- ExistsTableLookUpEntry({T},{C},{R}) -).
To decide what number is the value at row (R - a number) and column (C - a number) in (T - a table name): (- TableLookUpEntry({T},{C},{R}) -).

Column correspondence relates numbers to numbers.  The verb to be the column corresponding to implies the column correspondence relation.
To associate (C - a value of kind K valued table column) with (P - a K valued property):
	let the column number be C converted to a number;
	let the property number be P converted to a number;
	now the column number is the column corresponding to the property number.

To apply the properties in (T - a table name):
	repeat with the column index running from two [not one; that's the object column] to the number of columns in T:
		let the column number be the table column column index in T;
		unless the column number relates to a number by the column correspondence relation:
			next;
		let the property number be the number that the column number relates to by the column correspondence relation;
		repeat with the row index running from one to the number of rows in T:
			let the named object be the object column in row row index of T;
			unless the named object has property number property number:
				next;
			unless there is a value at row row index and column column number in T:
				next;
			let the value be the value at row row index and column column number in T;
			if table column column number is a block-value table column:
				store block value value as property number property number in the named object;
			otherwise:
				store non-block value value as property number property number in the named object.

Section "Demonstration"

The Kitchen is a room.
Here is an animal called the salamander.

Every object has a number called strength.
Every object has a number called size.
Every animal has some indexed text called tagline.

Table of Object Parameters
object column	description column	strength column	size column	tagline column (indexed text)
salamander	"A mythical lizardlike creature said to live in fire or to be able to withstand its effects."	12	201234	"x"
Kitchen	--	--	800	"y"
north	--	92	--	"z"

When play begins:
	associate the description column with description;
	associate the strength column with strength;
	associate the size column with size;
	associate the tagline column with tagline.

Instead of jumping:
	apply the properties in the Table of Object Parameters;
	say "Done."

Test me with "showme salamander / showme north / jump / showme salamander / showme north".

(Based on your other posts, I take it that you’re using a different strategy. But I didn’t want to leave up code that I know to be wrong.)