[recording courtesy of The_Dog.] Jerry_Cornelius says "ok, anyhow - let's get this rolling." SirBruceSterling has left. Jerry_Cornelius says "allright, please -" Jerry_Cornelius says "some procedure ? 1) if you have a question, whisper at me, and I'll stop when I can, if It's appropriate and get to it." Jerry_Cornelius says "2) I own this room, and the exit, so if you irritate me, I'll nail you with StormBringer here." Jerry_Cornelius sighs. Jerry_Cornelius says "ok, let's start." Jerry_Cornelius says "first off - what is UberMud - and why a UberMud ?" Jerry_Cornelius says "most of the MUDs I've seen require modification of their source code in order to add new capabilities to them." Jerry_Cornelius says "so I had this deranged notion that the ideal MUD would be written in itself, largely." Jerry_Cornelius says "someone has pointed out that this is appallingly GNUemacs-like (gag)" Stinglai has arrived. Jerry_Cornelius says "anyhow - Lachesis ?" Lachesis says "Jerry, could you tell us how the name 'UberMUD' came about? What's Uber?" Mutant has disconnected. Random has disconnected. Jerry_Cornelius laughs. "ok, well, the bloody unspellable german philosopher - NItxhasdkouas Jerry_Cornelius says "or whatever - had the UberMensch - super man. So I cribbed that." Random has connected. Jerry_Cornelius says "The idea was to make a "super MUD" that was capable of doing almost anything." Jerry_Cornelius says "Now, if some of you have read back in alt.mud, you'll have seen me raving about" Jerry_Cornelius says "the idea of implementing "magic" in MUDs." Jerry_Cornelius says "my thesis basically that "magic" is being able to alter the rules of your reality under control" lee has left. Mithran has left. Jerry_Cornelius says "this was the second reason I decided to write a MUD that was written in itself." Jerry_Cornelius says "Objects and programs in UberMud can non-locally alter reality, given permission." Jerry_Cornelius says "Tarador ? question ?" Tarador says "This is, of course, MUF you're talking about, right?" Random says "Of course, no." Tarador says "Hmm?" Jerry_Cornelius says "no, excuse me, this is UberMud I'm talking about." Mutant has connected. Jerry_Cornelius says "it hasn't gotten much press in the trade rags, Tarador :)" bob takes a moment out to boggle slightly. Random awards Tarador a gold star. Woodlock smiles. WhiteRabbit has arrived. Finrod gives Tarador a clue. Jerry_Cornelius says "anyhow, to continue." Mithran has arrived. Jerry_Cornelius says "The idea is that in order to implement an object such as a ring of teleportation, that ring has to be capable of operating on the internal rules of the game based on its program." Leona has disconnected. Jerry_Cornelius says "so, UberMud is really nothing but several programs bundled together." Jerry_Cornelius says "the most important part is the compiler." Jerry_Cornelius says "the compiler takes programs (from local disk or over the net) and compiles them into U-assembler." Jerry_Cornelius says "this is stored in the database (the source is thrown away)" Jerry_Cornelius says "the second most important part of UberMud is the interpreter" Mithran has left. Jerry_Cornelius says "the interpreter is a fairly simply program that reads a mass of U-assembler and executes its instructions." Jerry_Cornelius says "that's all." Jerry_Cornelius says "there are a reasonably large number of built-in operators and so on, that I'll get into later." Jerry_Cornelius says "the third part of UberMud is the "monitor"" Jerry_Cornelius says "the monitor is the only part of the MUD that is not written in itself" Jerry_Cornelius says "basically, it reads the input from a user, and tries to figure out what to do with it." Jerry_Cornelius says "typically, that will be to try to find a function to call." Jerry_Cornelius says "it doesn't have to be - but that's the typical case." Leona slides into Boneparte, putting on the seatbelt, and bringing the servos up to speed. A low thrum of power starts up. Jerry_Cornelius says "so, for example, you type "this is a test." Jerry_Cornelius says "the monitor receives the "this is a test" Jerry_Cornelius says "and detects the '"' character - which hard-codes to a "speech" function." Jerry_Cornelius says "at this point, a variety of places are searched for a speech function, which is then called with the remains of your text" Jerry_Cornelius says "any questions ? I'm kind of racing all over the place." Jerry_Cornelius says "hcobb ?" hcobb says "Is this an object pl?" Jerry_Cornelius says "by the way, if you have a question, just tell me - don't worry about the question - you'll have to repeat it :)" Jerry_Cornelius says "not exactly." Mutant says "Jerry, is there any easy way to restrict who gets to use the compiler?" Jerry_Cornelius shushes Mutan for a second. Jerry_Cornelius says "U is a very low level langauge." hcobb says "Can you clone off a compiled program and check for special condidtions?" Jerry_Cornelius says "it's like a cross between C and FORTH - mostly FORTH with a C syntax." Jerry_Cornelius says "hang on - wait until I answer one question, please :)" Tarador says "It just picks up all whispers in the room. I hate it." Jerry_Cornelius says "so, you can implement inheritance yourself, if you want it." Tarador says "oops!" Tarador apologizes. Jerry_Cornelius says "data structures and whatnot can be created - but there's no help in the system for doing so." Jerry_Cornelius says "Lachesis had a remark ? then Mutant ?" Lachesis says "I wanted to say that U looks to me like it is higher level than MUF/Forth, since it's possible to translate U -> MUF using a translator program." Jerry_Cornelius nods. Jerry_Cornelius says "Mutant ?" Random nods. Done, in fact. Moira is here, finally. Jerry_Cornelius waits. Mutant says "How does one limit accessibility to the @prog command (the command that allows one to write Ucode" Mithran walks up the steps and onto the stage. Jerry_Cornelius says "yes - that is limited with permissions on the login, in the password file." Jerry_Cornelius says "you can disable programmer ability, or grant it, as well as Wiz privs." Jerry_Cornelius says "excuse me, Mithran ?" Jerry_Cornelius shrugs. Mithran says "umm sorry.." Tarador says "so it's basically just like setting MUCKER?" Jerry_Cornelius says "basically." Jerry_Cornelius says "ok - let me get back on track." Jerry_Cornelius says "I'm philosophising a bit here - apologies - but I think it's important." Jerry_Cornelius says "one thing that UberMud does not enforce is control against "spoofing"" Jerry_Cornelius says "some people see this is as a big flaw. I don't" Tarador says "spoofing?" Jerry_Cornelius says "spoofing:" fur has arrived. Jerry_Cornelius says "for example, in UberMud, I could suddenly cause everyone to see text reading:" Tarador says "Ah, that's Atlantis's department." Jerry_Cornelius says "Tarador picks his nose" Jerry_Cornelius says "and there is no way to tell where it originated." Yorik says "Spoof-proofing can be done in the universe paradigns, correct?" Tarador says "I've seen whisper-detectors at Atlantis.. 'tis scary." Jerry_Cornelius says "yes and no." Jerry_Cornelius says "ok, stop interrupting." Jerry_Cornelius says "anyone with programmer access can spoof easily." Jerry_Cornelius says "you could write your universe rules to be very restritive, and not give anyone" Jerry_Cornelius says "access to programmer mode" Jerry_Cornelius says "but then - why run UberMud ?:)" Yorik nods. Jerry_Cornelius says "so - I deliberately ignored the issue - based on the idea that spoofing, when done by mature and sensible MUDders can be fun." WhiteRabbit applauds. Jerry_Cornelius says "and based on the idea that I'd revoke the login of anyone who spoofed nastily." Jerry_Cornelius says "Random ?" Random says "Not that I'd care to, but there is a purpose for UberMud even under a load of restrictions." Jerry_Cornelius blynx ? Random says "The fact is that a tinymud world looks an acts the same, period." Random says "An UberMUD can look very different with only a few people creating the universe, and the others merely playing in it." bob nods. Jerry_Cornelius nods. "very true" Random is done. Jerry_Cornelius says "good point." Jerry_Cornelius says "plus, if there is one programmer, he can make "nifty objects" for people." Yorik says "Ditto for a limited cadre of programmers." Mutant gets out the cattle prod. :) Jerry_Cornelius says "and, in fact, you can make objects that ease the process of, or control the process of creating objects" Jerry_Cornelius says "but I personally hate the idea." Jerry_Cornelius says "in order to get support for a MUD, people have to feel like they get what they put into it out of it - were I running a UberMud, I'd give everyone programmer access who wanted it." Yorik says "Depends on wether or not you want your universe to be programmer-friendly or not, Jerry." Jerry_Cornelius says "and if someone proved to be a jerk, you can annihilate objects in UberMud :)" Jerry_Cornelius says "ask Halloway" Jerry_Cornelius grins pointedly at bob. Jerry_Cornelius says "anyhow." bob looks cutely innocent. Jerry_Cornelius says "how do objects in UberMud work ?" Jerry_Cornelius says "unlike most MUDs I've seen, there is no "type" of object." Jerry_Cornelius says "an 'object' is just a holder for a variety of gobs of data and functions, called 'elements' and nothing more." Jerry_Cornelius says "there is not structure to an object - so unlike TinyMUD, adding a new field to an object does not require restructuring anything." Jerry_Cornelius says "the tricky part comes when you interface all this with your universe rules." Jerry_Cornelius says "since the universe itself is written in U, there need to be conventions established as to what objects represent what." Jerry_Cornelius says "an object is given a unique number. EG: #44" ChupChup notes it's dark :) Jerry_Cornelius says "suppose #44 has an element: #44.nam = "Jerry Cornelius";" Jerry_Cornelius says "now, in the current version of the universe rules, the ".nam" element is the name of the object." Jerry_Cornelius says "so, when you look at someone, in the current universe, the system look() function gets called, and figures out (its more complicated than this) which thing it is looking AT" Jerry_Cornelius says "and then prints the object's ".nam" and ".dsc" 9description)" Jerry_Cornelius says "and so on." Jerry_Cornelius says "fur ?" fur says "is that 3 character name bit just a convention? or will it only take 3 max?" Jerry_Cornelius nods. Jerry_Cornelius says "the maximum length of an element name is something like 55 characters." Jerry_Cornelius says "mostly to save space on disk, and to keep people from using stupid ADA-like: this_is_a_variable_indicating_my_state" Jerry_Cornelius grins. Finrod applauds Jerry. Jerry_Cornelius says "in the universe rules, things that are going to exist a LOT - such as "nam" should be short" fur dislikes trying to remember exactly which vowel someone left out of the abbrev Jerry_Cornelius says "to save some disk space. It's a trivial optimization, but waste not, want not." Jerry_Cornelius says "anyhow. to continue:" Jerry_Cornelius says "the weirdest part of UberMud rules is the business of matching stuff." Jerry_Cornelius says "suppose you want to write a take() function - or get() to you unenlightened." Jerry_Cornelius glares at Moira. Mutant glares at Jerry ChupChup must be unenlightened too Moira snickers. Jerry_Cornelius says "you need to be able to match the object by name. so - we introduce the idea of lists:" Jerry_Cornelius says "one variable type you can have in UberMud is the objectlist." Yorik is unenlightened, but earnest in his desire to eradicate his ignorance. Jerry_Cornelius interrupts himself. Moira mutters quietly to jerry to stick a take on himself. sheesh. :) Jerry_Cornelius says "this is the beauty of UberMud - Chrysalis' version uses get() - mine take() - but neither of us had to hack and #ifdef any C code." Jerry_Cornelius says "anyhow." Jerry_Cornelius says "lists are just a vector of object numbers." Jerry_Cornelius says "so, a "room" might have a list of things in it." Jerry_Cornelius says "and a list of players." Jerry_Cornelius says "for example, I have a room, and in it are:" Jerry_Cornelius says "$room.nam = "a dusty room"; /* the room name */" Loup-Garou goes home. Jerry_Cornelius says "$room.dsc = "you see a dusty room, with...."; /* desc */" Jerry_Cornelius says "$room._ply = ;" Jerry_Cornelius says "now, I didn't represent it, but the list would be the object #s of all the players in the room." Jerry_Cornelius says "so if #44 (me) and #55 were in the room, that list would contain those numbers." Jerry_Cornelius says "also, say the room has some objects:" Jerry_Cornelius says "$room._cnt = ;" Jerry_Cornelius says "it's kind of irrelevant what they might be." Jerry_Cornelius says "excuse me." WhiteRabbit says "Is the _ a convention?" Jerry_Cornelius says "ah, ok." Jerry_Cornelius says "there is a simple hack to prevent anyone but the Wizard (via the universe rules) from modifying elements that start with '_'" Jerry_Cornelius says "this makes it possible to have some values be "special"" Yorik nods...he was about to ask about that. Jerry_Cornelius says "there is also a complete permissions system, but this is a deliberate way" Jerry_Cornelius says "of making it *obvious* what are privileged elements." Jerry_Cornelius says "to keep the universe from being really weird, I keep people from being able to_lly modify the contents lists of rooms." Jerry_Cornelius says "if you could, then you could teleport people into eachother, and so on." Jerry_Cornelius says "anyhow." Jerry_Cornelius says "when you type : "get cat"" Jerry_Cornelius says "the monitor tokenizes the input into "get" and "cat"" Jerry_Cornelius says "then it searches the master system table for a function named "get"" Jerry_Cornelius says "(I'm simplifying some things)" Jerry_Cornelius says "and, if it finds it, it calls get("cat")" Jerry_Cornelius says "at that point, it is now running purely interpreted, and has no care what the hell the get() function may do - that is determined by the Wiz" Jerry_Cornelius says "suppose our get() function is fairly normal." Jerry_Cornelius says "it will try to match "cat" against the list of the room's contents." Jerry_Cornelius says "now, in U, the room's contents can be written as:" Jerry_Cornelius says "#actor._loc._cnt" Jerry_Cornelius says "what this means is:" Jerry_Cornelius says "#actor /* the current actor - player */" Jerry_Cornelius says "._loc /* location */ - IE: the player's location." Jerry_Cornelius says "._cnt /* contents */ - IE: the contents list in the player's current location." Jerry_Cornelius says "you can string element names into arbitrarily long chains, by the way." Jerry_Cornelius says "so, there is a function match() which scans a list. So I could do:" Jerry_Cornelius says "$result = match("cat",#actor._loc._cnt." Jerry_Cornelius says "oops." Jerry_Cornelius says "erase that." Jerry_Cornelius says "$result = match("cat",#actor._loc._cnt,"nam");" Jerry_Cornelius sighs. Jerry_Cornelius says "what that means is to match for "cat" in the given list, against the field "nam"" Jerry_Cornelius says "so, if #actor._loc._cnt has the following objects on it: #42, #992" Jerry_Cornelius says "it would match "cat" against #42.nam and #992.nam" Jerry_Cornelius says "Lachesis ? sorry I took so llong." Lachesis says "Can "get cat" be a function? (i.e., can a function name have embedded spaces a la TinyMUD?) Can a local 'get' override the system 'get' temporarily? (Could a 'normal' programmer do it? Could a 'wizard' programmer do it?)" Jerry_Cornelius says "yes." Jerry_Cornelius says "the monitor's pretty comples." Jerry_Cornelius says "which is why I said I was simplifying." Jerry_Cornelius grins. Lachesis smiles. Jerry_Cornelius says "let me back up slightly, since Lachesis' question raises issues more important than syntax." Jerry_Cornelius says "there is a "special" object, called the "system table", object #0." Jerry_Cornelius says "object #0 is always kept in memory for speed, and is owned by the Wiz." Jerry_Cornelius says "this is where "system" functions like get() look() go() are stored." Jerry_Cornelius says "when I type "get cat" it looks for "get()" in the system table." Jerry_Cornelius says "if it finds it, it then checks to see if that function is flagged as "block" which means it cannot be overriden." Jerry_Cornelius says "if it's marked "block", it calls the function, and that's that." Jerry_Cornelius says "if not, it remembers if it found it, and then searches the current room for a matching get()" Jerry_Cornelius says "failing that, it searches the object the player is using," Jerry_Cornelius says "and lastly the player" Jerry_Cornelius says "no - this is hardcoded - it's the only part of UberMud that is hardcoded." Jerry_Cornelius says "since some assumptions about the element names need to be made." Jerry_Cornelius says "oh, right - if it failed to find anything else, it would check the system table again and call it if it found an "unblocked" system function." Jerry_Cornelius says "there's another aspect in the monitor:" Jerry_Cornelius says "functions can be (by anyone) marked as "chain" functions/" Jerry_Cornelius says "this informs the monitor to keep looking and calling functions even after it finds one." Jerry_Cornelius says "so, you could have a function marked "chain" tied to a room: look()" Jerry_Cornelius says "and when someone does a look() in the room, it gets called." Jerry_Cornelius says "*then* the system function gets called." Jerry_Cornelius says "so, one action can cause up to 4 function calls" Jerry_Cornelius says "of course, each function can call other functions." Jerry_Cornelius says "things could get quite busy. you could have a room where you look() and hte lights come on, or whatever." Jerry_Cornelius phews. Jerry_Cornelius says "my fingers are getting tired. questions ?" Jerry_Cornelius pours coffee Jerry_Cornelius says "fur ?" fur says "how robust are the functions? can you pass anything to them w/o crashing? what does it do if it encounters a bad arg in the middle of a routine?" Jerry_Cornelius says "the functions are totally robust." Jerry_Cornelius grins. Jerry_Cornelius says "honest!" bob notes that there is no such thing as a bad argument. Jerry_Cornelius says "U has a notion of "NULL" as a primary data type." fur says "if i pass a bad arg how far back with it blast execution?" Jerry_Cornelius says "not at all." Jerry_Cornelius says "if you call bar(99);" Jerry_Cornelius says "and bar tries to access its 3rd parameter ($3), $3 == NULL" Jerry_Cornelius says "you can do anything you like with $3, but it's NULL." Jerry_Cornelius says "if you try to access an element that is not there." Jerry_Cornelius says "EG: foo(#99.blarz);" Jerry_Cornelius says "and #99.blarz is not really existing." Yorik says "Jerry, how simple are the docs? Is there anything on the order of 'U programming for FEMs?' Or does it fall back on RTFM?" Jerry_Cornelius says "it just calls foo(NULL)" hcobb says "How to stop: You paint the Blue Ball Red: You see a Blue Ball painted Red?" Random notes that the docs are excellent. Jerry_Cornelius says "ok, hang on." Jerry_Cornelius blushes. "the docs are not for an English Major, I fear" Jerry_Cornelius says "but I tried to make them coherent." Mutant says "And succeeds, mostly...." Moira objects strenuously. Jerry_Cornelius says "the language is as simple as I could make it, so it could do anything." Jerry_Cornelius says "there's always a damn trade-off." Jerry_Cornelius says "I personally feel U is a pretty easy language to learn." Moira says "Jerry has written one of the best set of docs I've ever seen, which is very remarkable, considering he programmed the whole mess." bob nods at Jerry. Jerry_Cornelius says "for one thing, it protects you against errors, by hiding them." Jerry_Cornelius says "whenever you try to do something illegal, the interpreter tries to cover" hcobb says "How then to debug your Code?" Jerry_Cornelius says "it up as well as possible." Yorik says "OK...I trust Moira and bob and Random on this. One of the things that really intimidates me about this entire generation of MUDs is my lack of basic programming knowledge." Jerry_Cornelius nods. Jerry_Cornelius says "ok, hold off on questions - this is important." Jerry_Cornelius says "I'll get to you hcobb" Jerry_Cornelius says "right, that's why it's my feeling that the language has to be as booby-proof as possible." Jerry_Cornelius says "one thing that's nice is the way functions can be written to do the "hard" things." Jerry_Cornelius says "so, for example: there is an emote() function" Jerry_Cornelius says "that takes strings:" Jerry_Cornelius says "emote("hops around")" Jerry_Cornelius says "and generates: "Jerry Cornelius hops around"" Jerry_Cornelius says "(note the space)" Random chuckles. Jerry_Cornelius says "it's possible to do a lot (I think) with building blocks." ChupChup goes home. Jerry_Cornelius says "ok, debugging:" Jerry_Cornelius says "well, U is compiled." Jerry_Cornelius says "so you really can only debug by coding and trying." Jerry_Cornelius says "but I find it fairly easy. you write the object so it echo()s to you" Jerry_Cornelius says "what it is trying to do, until it works, then you take them out." Jerry_Cornelius says "fur ?" Jerry_Cornelius says "thanks for waiting." fur says "is there a way to tell the difference between an object with an element thats currently NULL and an object that doesnt have that element?" Jerry_Cornelius says "no" Jerry_Cornelius says "NULL is magic." Jerry_Cornelius says "in fact, the way you destroy an element is to assign it to NULL." Jerry_Cornelius says "#44.bar = "foo";" fur says "just checkin.." Yorik grins. Jerry_Cornelius says "#44.bar = NULL;" Jerry_Cornelius says "and *poof* it's space is freed." Jerry_Cornelius erases the ' with a blush. Jerry_Cornelius says "there is a static checker I wrote to help debugging" Jerry_Cornelius says "so you edit your source code on your machine, and run it through the checker." Moira runs boot.u through the checker even as jerry speaks. heh. Jerry_Cornelius says "the checker will weed out syntax errors. and gives better error messages than the compiler." Finrod nods. Very sensible. Jerry_Cornelius says "ok." Jerry_Cornelius says "more questions ? this is a lot of stuff, and I'm only scratching the surface." Jerry_Cornelius pours coffee Jerry_Cornelius says "fur ?" hcobb says "Programs are objects?" WhiteRabbit says "So the checker is sort of like lint?" fur says "can you go over the * and & stuff?" Jerry_Cornelius says "yes, WhiteRabbit" Jerry_Cornelius says "programs are elements, hcobb." Jerry_Cornelius says "IE: a function would be #44.nb();" Jerry_Cornelius says "ok, fur's question:" Jerry_Cornelius says "there is an ability in U to "reference" elements." Jerry_Cornelius says "so that if I want to save on duplicated strings." Jerry_Cornelius says "suppose I have 10,000 rooms that are all painted grey:" Jerry_Cornelius says "I describe the first one: $room.dsc = "a grey room...";" Jerry_Cornelius says "then I can make a REFERENCE to that string:" Jerry_Cornelius says "$room2.dsc = &$room.dsc;" Jerry_Cornelius says "now, they both point to the same string in the database." Jerry_Cornelius says "saves space, and..." Jerry_Cornelius says "if I get tired of grey and want them all to be pink:" Jerry_Cornelius says "*$room2.dsc = "a pink room..."" Jerry_Cornelius says "presto. the '*' tells it to change the CONTENTS of the reference." Jerry_Cornelius says "so they all change at once." Jerry_Cornelius says "if I simply said, $room2.dsc = "a pin...";" Jerry_Cornelius says "it would break the reference, and I have 9999 grey rooms (all the same string) and one pink one." Jerry_Cornelius says "this gets really useful, since you can have a large number of objects all sharing a common data space." Jerry_Cornelius says "suppose I want to have a telephone system (those are all the rage) with a single subscriber list." Jerry_Cornelius says "I can point all those phones subscriber lists to the same "real" list." Jerry_Cornelius says "and, in fact, I can make references to the functions, too." Jerry_Cornelius says "so I can have them all use the same ring() function - and I can change it to beep() on all of them simultaneously." Jerry_Cornelius says "Lynx ?" Lynx says "This doesn't seem identical to the way C handles pointers (you'd have to do *room2.desc in C to get the desc, whereas this seems handled automatically here) So what happens if you do room3.desc = &room2.desc where room2.desc= &room1.desc?" Lynx says "And then change room2.desc?" Jerry_Cornelius nods. Jerry_Cornelius says "U is not C-like in that (really) in U, everything is a reference counted pointer." Jerry_Cornelius says "so, there is NO difference between room2.dsc and room1.dsc at all." Jerry_Cornelius says "in fact, it's impossible to tell them apart except by name." Jerry_Cornelius says "each time a reference is made to an object, its reference counter is incremeneted." Jerry_Cornelius says "each time an element is assigned to NULL, it is decremented." Lynx points out the two different ways to change it: with a *room2.dsc assignment, you change room1.dsc, so there's no problem there, but what about room2.dsc creating a new entry? Does room3 still point to room2? Jerry_Cornelius says "when it hits 0, it's freespaced without a spacesuit" Jerry_Cornelius says "yes, Lynx, it does." Jerry_Cornelius says "opos." Lynx hmmmms.. 'kay. Which explains why Moira told him it would be impossible to get an object count. Jerry_Cornelius says "parse error." Jerry_Cornelius re-reads. Jerry_Cornelius says "no." Jerry_Cornelius says "when room.dsc is assigned, it drops the reference, and creates a new hunk of storage for room2." Jerry_Cornelius says "the ref count on the old hunk of data is still > 0 so it hangs around." Jerry_Cornelius says "Moira's problem is entirely different, for various reasons." Jerry_Cornelius says "fur ?" fur says "how is the code stored? once compiled is there anyway to get the source back from it?" Jerry_Cornelius says "nope." Jerry_Cornelius says "it is compiled into a packed bit-vector, with a packed string table." Lynx thynx he sees how UberMUD's variable system works, thanx. (it's weird, but..) Jerry_Cornelius says "I suppose you could disassemble it, but, ick." Jerry_Cornelius says "let me again philosophise :)" Jerry_Cornelius says "I did this on purpose." Jerry_Cornelius says "because it forces programmers of "nifty objects" to keep them themselves." Jerry_Cornelius says "that way, if the host MUD goes down, they still have it!" Jerry_Cornelius says "none of this "give me a dump of my tank!"" Jerry_Cornelius says "now, I realize that this means that someone could easily write an UberVirus" Jerry_Cornelius says "no lie." Jerry_Cornelius says "but that brings me back to my, "this is an adult MUD"" Jerry_Cornelius hangs in the net. Jerry_Cornelius says "argh." Jerry_Cornelius says "that was a good one-minute blackout." Jerry_Cornelius says "hcobb ? question ?" Ghondahrl says "Keep typing; we'll get it eventually." Jerry_Cornelius grins. Jerry_Cornelius used the time to rub his aching fingers. hcobb says "Self refernce defeats pointer counts" Jerry_Cornelius says "pointer counts are hidden in U." Jerry_Cornelius says "you never see them." Jerry_Cornelius says "basically, in U, the "pointer" is only the "name" of the thing - #44.bar - the actual storage is somewhere else." Jerry_Cornelius says "Lachesis ?" Lachesis says "I'd like to know if everything in UberMUD is packed. Also, an estimate of cost in size/object would be nice." Jerry_Cornelius says "everything is packed." Jerry_Cornelius says "a reasonable sized function - say - the system look() which is pretty complex" Jerry_Cornelius says "compiles to about 1k" Yorik chuckles. Jerry_Cornelius says "that is about, what, 80 lines of code ?" Moira counts. Jerry_Cornelius says "simple stuff, like echo("foowa");" Jerry_Cornelius says "compiles to ~120" Mutant wonders how big the go() function compiles to? Jerry_Cornelius doesn't know. Jerry_Cornelius says "fur ?" fur says "are all objects reference counted? i assume its the programmers responsibility to break circular references for complex objects if that is the case.." Jerry_Cornelius says "all elements are reference counted" Jerry_Cornelius says "and I can't think of a way to make a circular reference." fur says "but not the objects then?" Moira says "er... would you believe 127 lines for look(), jerry?" Jerry_Cornelius says "the 'object' itself :) doesn't really exist." Jerry_Cornelius says "the 'object' is actually a little hole in the database that doesn't store anything at all, except some permissions." fur says "is #44.foo = #33 not legal?" Jerry_Cornelius says "nope." Jerry_Cornelius says "that's a compile-time error." fur says "oh so it must be stored in a one element list?" Jerry_Cornelius says "Finrod ?" Finrod says "Does Uber have any capability for asynchronous or timed events?" Jerry_Cornelius says "no." Finrod says "I.e. could I have a streetcar or bus that passes by every n minutes or so?" Jerry_Cornelius says "I had a nifty idea for that, but never got around to it." Finrod nods. Jerry_Cornelius says "basically, there was going to be an external deamon tied to a port" Jerry_Cornelius says "that would crontab-like read a script and call functions" Jerry_Cornelius says "there'd be a way to submit stuff, etc." Jerry_Cornelius says "never got around to it." Jerry_Cornelius says "hcobb ?" hcobb says "What if you carry a refernce to yourself (a photo)" Jerry_Cornelius grins at Finrod, "work ruins some many good games" Lachesis agrees with Jerry about that. Jerry_Cornelius says "a photo wouldn't be a reference to yourself, and you couldn't, since" hcobb says "will look() know better than to follow the pointers around forever?" Finrod agrees wholeheartedly with Jerry. Jerry_Cornelius args. Jerry_Cornelius says "ok, DON'T whisper complex questions at me." Jerry_Cornelius 's train of thought derails with a rending crash. Mutant points out you'd need an infinite number of args for that, hcobb. bob thinks Jerry better either a) go over the internals a bit, or b) assert flatly that circular refs can't happen. Jerry_Cornelius says "right." Jerry_Cornelius says "I don't want to go into internals, so take my word for it you can't circ ref." Jerry_Cornelius says "nor can you infinite loop." Jerry_Cornelius says "please take that for granted." phi has the following idea: drop shouldn't be a univerrse function. Mutant soaks Jerry's poor fingers in hot water to relax them. Jerry_Cornelius says "it has to be" Jerry_Cornelius says "because it modify's the room's contents list." phi explains: there can be a function to teleport things around, so that you can get rid of things, and _room_ functions called drop. Jerry_Cornelius says "you need to restrict permissions on that, otherwise, you could stuff everyone in the room into a bad and carry them off." Jerry_Cornelius shushes phi. Jerry_Cornelius says "you *CAN* have a room drop() function - and have it call back to the system one." Jerry_Cornelius says "ok, quiet down." Jerry_Cornelius says "I do not believe in object-oriented-type "give everything a copy of the function"" Jerry_Cornelius says "that's a waste of space (even if you just use pointers)" Jerry_Cornelius says "since you have to fiddle pointers 'till tinyHELL freezes over." Jerry_Cornelius says "so, I went with the idea of a "system table" for general functions" Jerry_Cornelius says "that can be called by a programmer." Jerry_Cornelius says "for example, you can have system functions starting with an "_" char" Jerry_Cornelius says "and the monitor will not "see" them." Jerry_Cornelius says "thus, useful stuff like an _objgo() function for moving objects from room to room can be put out for general use." Jerry_Cornelius says "fur raises a BIG point I forgot to discuss!!" Jerry_Cornelius says "aiee!" fur gigglez Jerry_Cornelius winces. phi likes _ prefixes for system functions! Moira pokes jerry. "@._drive()." Jerry_Cornelius says "there is an idea of "setuid" functions." Jerry_Cornelius says "a function can be made "setuid" like a UNI* program" Jerry_Cornelius says "so that it takes the permissions of the owner of the function when it is" Jerry_Cornelius says "executed." Jerry_Cornelius says "thus, the system functions (which need to be able to modify the "magic" room contents lists, etc)" Jerry_Cornelius says "can be setuid, and they run as the Wiz." Jerry_Cornelius says "that way, you can have an object that (under control of its own program) modifies itself under my command." Jerry_Cornelius says "an example of that (if you've seen her) is Lulu the robot tank, who changes her internal values when you use the control box." Finrod asks, "Can the setuid be raised and lowered at will?" Jerry_Cornelius says "yes - mostly." Jerry_Cornelius says "it's lifted right from UNIX" Jerry_Cornelius says "so you can also make setuid() and getuid() function calls." Jerry_Cornelius says "so, a Wizard function might want to make itself run as the caller, by doing a setuid(#caller)" Jerry_Cornelius says "#caller" Jerry_Cornelius says "in UberMud, there are some "magic" object names." Jerry_Cornelius says "#caller - the id# of the object calling the current function" Jerry_Cornelius says "#self - the object # of the current function's base object." Jerry_Cornelius says "#actor - the object # of the idiot who's keypress started the whole thing." Jerry_Cornelius says "thus a function like:" Jerry_Cornelius says "func #44.bar { echo(#self,"\n"); }" Jerry_Cornelius says "will echo "#44"" Jerry_Cornelius says "func #44.bar { echo(#caller); }" Jerry_Cornelius says "if called by func #33 will echo "#33"" Jerry_Cornelius says "and so on." Jerry_Cornelius says "questions ?" Jerry_Cornelius says "fur ?" Lynx notes (not a question) that this lets the program scramble the caller completely. fur says "so the only time you would need to setuid() wiz was if you wanted to access a ._ element?" Jerry_Cornelius nods Jerry_Cornelius nods Jerry_Cornelius says "sort of." fur says "what if you call a func that does? does the top func need it?" Jerry_Cornelius says "all elements have permissions, too." Cal wonders what a ._ element is. Jerry_Cornelius says "so some elements might require wiz privs to modify - usually setuid wiz is for '_' elements." phi watches amusedly. Jerry_Cornelius says "to backtrack, '_' elements are "privileged" elements." Jerry_Cornelius says "Ghondharl ?" Ghondahrl says "Any thoughts on spoof-proofing?" Jerry_Cornelius says "I've more or less given those already:" Jerry_Cornelius says "you spoof me, and it's fun, fine." Jerry_Cornelius says "you spoof me and I don't like it, you're off my MUD." Jerry_Cornelius says "each Wiz will have thier own policy." Jerry_Cornelius says "Finrod ?" Finrod says "Are object numbers ever reused? Or is an obj # a permanent entity?" Jerry_Cornelius says "good question, but nitty&gritty" Jerry_Cornelius says "since the object# doesn't really mean anything, it's thrown away." Ghondahrl notes that there are other spoof-proofing options, probably to be outlined at the MOO lecture ... if there is one. Jerry_Cornelius says "this means that when the MUD has had 32 bits worth of objects, you have a problem. :)" Finrod says "Object #'s have reference counts as well?" Jerry_Cornelius says "each object # really points to a base object, which CAN get re-used, but there is no way to look at the base object." Jerry_Cornelius says "object #s are meaningless. they are just a "handle" used to access the elements uniquely." Jerry_Cornelius says "fur ?" fur says "is there a primitive function to boot someone off the game?" Jerry_Cornelius says "yes" Jerry_Cornelius says "UberMud is written so all the code for the network is a separate layer" Jerry_Cornelius says "but there are basic operations on the network layer" fur says "are those functions listed somewhere? i dont member them.." Jerry_Cornelius says "disconnect(object #) will drop object #" Jerry_Cornelius says "you haven't FTP'd the latest doc." Jerry_Cornelius says "whenever I add something, I update the doc." fur nods Moira kicks jerry. Jerry_Cornelius says "phi asks why I use a 32 bit #. It's easy." Jerry_Cornelius says "that's all." Jerry_Cornelius says "argh." Moira mutters, and goes back to editing code. Jerry_Cornelius says "Mutant points out that I forgot something semi-major." Lachesis applauds Jerry_Cornelius. Lachesis says "Oops." Cal wonders if you ever reuse numbers. Mutant grins at Jerry. Jerry_Cornelius says "there is an ability to convert a string into an element name." Jerry_Cornelius says "this permits all manner of evil kludges." Jerry_Cornelius says "so, for example: #44.("bar");" Jerry_Cornelius says "is the same as #44.bar" Mutant says "#33.("nam") == #33.nam" Jerry_Cornelius says "BUT" Jerry_Cornelius says "you can put *anything* returning a string in the ()" Cal winces. Jerry_Cornelius says "such as: #33.(strtime())" Jerry_Cornelius says "will create an element named today's date :)" Jerry_Cornelius says "this is an abomination, but a useful one." Lachesis says "Reminiscent of Rexx and SNOBOL and Icon." Jerry_Cornelius says "I only added it after some major soul-searching." Ghondahrl chuckles. Jerry_Cornelius says "there are also functions to list the elements tied to an object" Lynx checks. "Jerry, if the program's compiled, when is strtime evaluated?" Jerry_Cornelius says "yes, elements CAN have spaces :)" Jerry_Cornelius says "let's not all talk and whisper to me at once..." Jerry_Cornelius says "function calls are all resolved at run-time" Mutant tries to think of anything else Jerry has forgotten. "What about the O, I and W flags? Jerry_Cornelius says "this is mandatory, since functions might call other functions, which can change between calls." Jerry_Cornelius says "there's more important stuff than that, Mutant." Jerry_Cornelius says "I'll mention I've left a ton of stuff out." bob grins. Jerry_Cornelius says "let me take fur's ? and I'll talk about iterators" Jerry_Cornelius says "fur ?" fur says "are lambdas possible?" Lachesis grins. Jerry_Cornelius does not dance the lambadba Jerry_Cornelius says "If I knew what it was, I'd answer that." Jerry_Cornelius says "anyhow... :)" Moira says "it's the greek letter l." Lachesis sighs in disappointment. A lambda creates a function Finrod laughs. fur says "a nameless functions.. a block" Jerry_Cornelius says "function blocks are possible." Jerry_Cornelius says "oooooh, ick!" Lachesis explains: (define (is1? x) (lambda (y) (= x y))) Jerry_Cornelius says "ok." Jerry_Cornelius says "everyone stop whispering at me! :)" Lachesis says "(is1? 3) returns a function that returns true if (y == 3)" Jerry_Cornelius says "I have 6 versions of what a lambda is. I don't know." Jerry_Cornelius says "ok - no - we don't need no steenking lanmdbas" Jerry_Cornelius says "fur ? *another* question ?" Jerry_Cornelius grins. Mutant watches the "Jerry and fur debate hour" fur says "is it possible to construct a string and have it compiled at runtime?" Jerry_Cornelius says "no. never." Jerry_Cornelius says "that is a TOTAL abomination." fur bums out.. Jerry_Cornelius says "ick." Cal says "That's lisp." Mutant likes self-modifying code. :) Lynx wonders what fur means. "Wouldn't it be better to make a function that returns the string?" Jerry_Cornelius says "a language that permits that is egregiously badly designed." fur says "not necc.." Jerry_Cornelius says "anyhow." Yorik chuckles. "So, you're against English, Jerry?" Jerry_Cornelius says "My wife came home, and I'm awfully tired." Yorik grins. Jerry_Cornelius grins weakly. Jerry_Cornelius says "can I bail out, now ?" Woodlock wonders if anyone will argue that English is not badly designed. :) Lynx 'gryns and snuggles Jerry. "Sure, let's put bob on the hotseat." Yorik thanks Jerry, and hands him the hat of holding. bob eeps! Jerry_Cornelius yanks StormBringer out of the podium. Lachesis applauds Jerry, giving him a hug. Jerry_Cornelius grins. Jerry_Cornelius waves. Cat smiles. "No, Jerry, we will make you stay!" ;) Moira will sit here and answer silly u questions. The_Dog asks for reciepeints of LOGs Kumiko contratulates Jerry. Finrod gives Jerry a round of applause. Lynx wants one. Jerry_Cornelius says "someone can mail me a log." Kumiko wants one. Woodlock wants one, too. fur says "thnx for talk jerry!" Techno.Destructo laughs Jerry_Cornelius nods. Moira hugs Jerry, and tells him to log out and talk to his wife. Cat applauds JC for the lecture. bob thanks Jerry too, and applauds politely. bob seconds Moira's motion! Mutant thinks it was pretty good, would have been less good if he had not been around to remind Jerry.... :( Kumiko hates people who decide to relocate network hardware without advance notice. GRR! Jerry_Cornelius goes home.