untermud/DOC/
untermud/DOC/U/
untermud/DOC/U/U-examples/
untermud/DOC/internals/
untermud/DOC/wizard/
untermud/MISC/
untermud/MISC/dbchk/
untermud/RWHO/
untermud/RWHO/rwhod/

	Well - this is it.

	What can you do that's different? I haven't a clue, there are so
many things.

	First off, some policy:
	-----------------------
	-> All permissions policy is enforced EXACTLY the same way as
	under plain old Unter. If not, you have found a bug; notify me.
	This means that if you try to U-code at an attribute you don't
	normally have permissions to access, you won't.

	-> All spoofing policy should be enforced EXACTLY the same
	way as in plain old Unter. if not, you have found a bug.
	UNLESS you have defined the newlines-in-U option in config.h

	-> Wherever possible, intellectual similarity between existing
	Unter constructs has been preserved. This is NOT the case in
	a few areas, namely:

		${...} stuff isn't supported in U. It's not needed.

		$me and so forth *are* supported and should work as
			U-temporary variables (you can assign to
			them but only affect local scope)

		#object-id which is *NOT* used in macros *IS* used
			in U-code. This is necessary for a lot of
			reasons relating to making the language
			grammar clean. If someone can think of a
			*CLEAN* way to fit '#object' into the
			macro language, feel free to do so.


	Briefly, what can you do:
	-------------------------

	-> You can set U-code (type 'U') on ofails, osuccs, objects,
	*BOOLEAN LOCKS* or anything you'd be able to stick a macro
	on, and it should work "normally". If it does not, you have
	found a bug; notify me.

	-> U-code as a lock should return 0 or 1, or it defautls to 0.
	U-code on locks runs as the locked object, permissions wise.
	This should be an amusing capability.

	-> You can type U-code directly into the MUD by preceeding it
	with a '!', EG:

!echo("you see ",rnd(100)," fine happy otters!);

	and the expected should happen.

	-> Right now there is no documentation on the list of builtins
	available to the U-interpreter, other than U/bltin.c. Most of
	them should be pretty obvious, and if they aren't either you're
	stupid or it's broken.

	-> Assignments and object dereferences have typical old UberMUD
	syntax, except there is no reference or pointer objects. If
	you want to examine something, try:

!echo("Your name is ",$me.nam);
!echo(#0.nam);

	etc. Permissions are enforced, so watch it. OWNERS are a list
	in Unter, so you can't JUST examine an object's owner by
	a deref, you need to iterate the list, EG:

!foreach $goober in (#thing.own) echo($goober.nam);

	-> *THIS IS IMPORTANT* - calls to macro commands can be made
	transparently from within U. Try it:

!$me.thang = @build("object","something");echo("saved ",$me.thang);

	Most macro commands just return NULL or numeric zero, so you
	can capture the return value, if you like:

!$tmp = @whisper("bob","eels!"); if($tmp == NULL) echo("whisper failed ", \
error($tmp));


	-> Assignments work like they should:

!#33@DECMUD.nam = "FishLips";
!$me.nam = "wubba!";

	-> You can iterate across parameters:

!foreacharg $foo { echo($foo); }

	-> You can do simple math:

!$tmp = 0;foreacharg $foo { $tmp = $tmp + 1; } echo("params= ",$tmp);

	-> Which can be reduced by the wise to:

!echo($#);

	-> Assigning U-code programs is done like "normal", IE:

set me U wubba = echo("this is U-code, fool!");
!$me.wubba = "echo(\"this is U-code, fool!\");";

	-> There is a type-casting operation that can be performed to set
	the type of an assignment:

!$me.foo = (num)"125";

	which will try to do the right thing.


	This is enough to get you started, I suspect. Go have fun. I'm sure
stuff will crop up. Before you make some snotty remark about how I f***ed
up such-and-such, ask yourself why you didn't write this interpreter
yourself - 'cuz if you piss me off, I'll ask you exactly that question,
so you'd better have an answer ready.

mjr.