Edited for relevance.


From:    Pavel Curtis
To:      MOO-Cows
Subject: The 1.8.x planned feature list
Date:    Wed, 16 Mar 1994 21:14:38 -0800

OK, at long last, here's my list of everything I am consciously planning to do
in 1.8.x.  Note that `disk-basing' and `multiple inheritance' are not on this
list; the former is, as I've said, in the queue for 1.9.0, and the latter is
not in the plan at all.

There are no release times in this message; I have no estimates available, so
don't bother asking.  Sorry.

[...]

++ New MOO value type: tables
	Tables are like lists except that that map from values to values,
	rather than just from a small range of numbers to values; this is
	useful in a wide range of applications where programmers are trying to
	associate values with arbitrary `keys'.  Implemented using hashing and
	some tricky collaboration with the reference counter, many common
	styles of use will be efficiently performed using side-effects without
	ever showing the MOO programmer anything that violates the current
	model that all values are immutable.

[...]


From:    Pavel Curtis
To:      Robert Leslie
Subject: Re: Simulating LambdaMOO 
Date:    Thu, 21 Jul 1994 15:08:59 PDT

[...]

> Second: Tables. I have not been able to come up with a satisfactory syntax
> for creating these associative arrays within the MOO language. I plan to
> implement tables as a new datatype, but so far I have limited myself to the
> following interface:
> 
>   ...

One thing you didn't mention was iteration over tables.  I envisioned a
construct like this:

	FOR k-var ~ v-var IN (table-expr) stmts ENDFOR

The tilde comes from this:

> Have you considered any input syntax for creating tables in MOO?

I was planning on using

	{key1 ~ value1, ...}

The amusing thing is to consider meanings for the MOO `@' syntax:

	{@table, key ~ value}
	{key ~ value, @table}
	{@table1, @table2}

I like the conceit that the resulting table behaves as if you were searching
the constituent tables and pairs in left-to-right order, so the first example
uses the binding of `key' only if it isn't already bound in `table', the second
example overrides the binding of `key' in table (if any), and the third example
uses only those bindings from `table2' that are for keys not bound in `table1'.

> I think modifying tables should be something as easy as:
> 
>   ;me.tab["newkey"] = "newvalue"
>   => "newvalue"
> 
> But keeping with the rest of the MOO programming philosophy, I think I agree
> that immutability should be preserved.

I completely agree.

> How do you feel about removing keys from a table, or looking up a nonexistent
> key? Is it enough to use the zero value to facilitate these?

That would be inconsistent with the rest of MOO.  We are getting an
exception-handling facility in 1.8.0 (already mostly working...), so I see no
reason to do this kind of result-overloading.

>   ;me.tab = tabledelete(me.tab, "key")
>   => {table}
>   ;me.tab["nonexistent"]
>   => (Error: E_RANGE)

I intended this.  It would be nice to do something prettier than that
`tabledelete' function, but I don't have any good ideas along these lines.  I
think it will be fine to just go with this.

In addition to the `tablekeys' and `tablevalues' functions (which maybe you
don't really need often enough to justify putting them into the server), I'd
definitely suggest a tabular equivalent to the `in' construct for lists;
perhaps `table_binds(table, key)'.  Of course, this is a test on the table keys
while `in' is a test on the list elements, but I think that disparity is pretty
natural considering the disparate uses of the two.

[...]

	Pavel