|
|
1.1 root 1: This file contains information on what's changed since the
2: DDL document people have seen.
3:
4: Date: 25 Apr 1980 1546-PST (Friday)
5: From: mike at UCLA Computer Science VAX (Mike Urban)
6: Subject: ATTN: DDL Implementors
7: To: cc (UCLA Computer Club)
8:
9: I would like the following changes made in DDL:
10:
11: 1) Friendlier Parsing. You should be able to say
12: give troll the knife
13: and get away with it (with "knife" as Dobj and "troll" as Iobj). You
14: should get messages like "I don't know how to tke" in the event
15: of a bad verb, and "I think 'north' is a verb" in the event
16: of a weird parse like "push north wall". You should be able
17: to say things like "e.s.s.take thing. eat thing. look" and have
18: the parser treat the "." as equivalent to and end-of-line.
19: /* ACCOMPLISHED 6/13/80. Syntax errors are now
20: of the form "I don't know how to xxx" if an unknown
21: word is encountered (the whole word, not just 5 letters
22: is printed); "I don't know the word 'xxxxxx'" for other
23: unknown words; and "I don't understand, because I
24: think 'xxxxxx' is a [noun/verb/adjective/etc]" for
25: other syntax errors. The separator was already
26: built into the lexer, but it's a comma, not a period.
27: And VERB IOBJ DOBJ is a legal syntax now, but
28: VERB PREP IOBJ DOBJ isn't (tho it's easy to add) */
29: MAYBE
30: (if it isn't hard), you should be able to say "take this, that, the other"
31: and have a more sophisticated control loop which causes it to act
32: like "take this. take that. take the other" with the EXCEPTION that
33: no daemon/fuse processing is performed (no turn increment) and that
34: the whole thing can be short-circuited by an appropriate Exit code.
35:
36: 2) Generalized routine and object handling. The routines associated with
37: objects should be properties of that object just like the others. The
38: constants that tell WHICH property is, say, the Action property should
39: be predefined. So ($setp room1 LDESC Rubbl) would set the long
40: description of room1 to the routine Rubbl (which describes the rubble
41: left by the explosion you just triggered...).
42:
43: /*** ACCOMPLISHED 6/6/80 ***/
44:
45: 3) Improved global handling. The programmer shouldn't have to know the
46: "address" of his globals. Instead, a construct like
47: VAR score
48: would be the equivalent of saying "score = xxx" where xxx is one less
49: than the last VAR done.
50:
51: /*** ACCOMPLISHED 5/29/80 ***/
52:
53:
54: 4) Improved grammeme access. There should be predefined VARs which
55: contain the values of ($verb) ($dobj) and ($iobj). You should
56: be able to re-assign these. SO, you should be able to say
57: turn off lamp
58: and the PreVerb routine for "turn" might contain something like
59: (($eq @Iobj off):
60: ($setg Verb douse)
61: ($setg Iobj 0)
62: )
63: /*** Accomplished 6/12/80; Only change in
64: ddlrun is #defines for verbtodo, etc */
65:
66: /*** 6/81 added Prep global to ddlcomp and
67: ddlrun to give access to preposition ***/
68: Because verbs don't have properties, we may wish for functions
69: to access their preverb and action routines as well.
70:
71: 5) String handling: It'd sure be nice to have someone type
72: incant "abra ca dabra"
73: and be able to talk about ($subs Dobj @var 1) or ($indx @Dobj "abra")
74: or whatever. I don't know exactly how to implement it yet.
75: /*** Accomplished 7/28/80; STRINGs are negative-valued
76: objects. If the lexer gets a string, it puts it into
77: a temporary string area (that is flushed every turn) and
78: returns an index (not pointer) into that are as a negative
79: number. The parser knows about these and can handle
80: verb string and verb string prep iobj sentences.
81: (the latter being for "Incant "rise" over seed".)
82:
83: If the dobj or iobj of an input is a string, the dobj
84: and iobj routines called are the ones associated with
85: the object STRING (if such is defined by the DDL
86: programmer). At present, the functions $substr, $length
87: and $eqst are defined. $substr returns a negative
88: pointer into the temp string area; this can be stored
89: in a global, for example. A permanent string area
90: is available, but I haven't written the function
91: ($sets glbl string) which would move the string to the
92: permanent area and put its index therein into glbl.
93: Mike ***/
94: /*** On 8/20/80, I added a new function (which, mirable dictu,
95: will allow coding of the "echo" room!), ($read), which
96: pauses, gets a line of input, and returns the line as
97: a string! Gee, if we code up ($pars str verb dobj iobj)...
98: The implementation is kludgy and nonintuitive. But then, so's a lot
99: of DDL
100:
101: 6) Ctrl-D should terminate the program. Ctrl-C should interrupt whatever
102: is happening and begin a new turn.
103: Note that this may leave things in a bad state.
104:
105: 7) New language construct: (WHILE condexp : formlist) is essentially
106: equivalent to (condexp : formlist ($____ formlist+condexp)) where
107: "($____ formlist+condexp)" is a new operator, JUMPB (jump back),
108: which is just like the current $.... jump forward instruction, but
109: (obviously) negative, and unconditional. It goes back exactly to
110: the beginning of the test.
111: /*** ACCOMPLISHED 8/18/80 --Mike ***/
112:
113: 8) New routine ($rand n) produces a somewhat random number in the range
114: 1..n . /*** ACCOMPLISHED 8/18/80 ***/
115:
116: 9) DDLRUN sources should be reorganized so as to enable recompilation
117: of less than the entire program if some less global change (such
118: as the addition of a new routine, or a bug fix in the parser) is
119: made.
120: /*** Somewhat accomplished 10/80. Still needs
121: work. In particular, changes in extvars.c must
122: be reflected in extvars.h ***/
123:
124: 10) The symbol table, and the hash routine, are simple-minded. The
125: 5-character limitation on names is a real pain for some people.
126: For example, you can't even fake the Zork puzzle room by allowing
127: someone to say "push northern wall".
128: These changes don't have to go together.
129:
130: /*** ACCOMPLISHED(!!) 11/80. Identifiers are pretty
131: much as long as you like. The symbol table,
132: now alphabetized, contains indices (not pointers)
133: into a pool of identifiers that starts at
134: sbrk(0). A binary search algorithm is used.
135: This will enable a future version to respond
136: correctly to unambiguous abbreviations for
137: things at runtime (like news for the aard
138: newspaper, for a cogent example). This
139: hasn't been tested for portability to a
140: PDP-11 under V7, so beware. As of 11/18,
141: the symbol table is still unencrypted ***/
142: /*** The runtime parser recognizes unambiguous
143: abbreviations. The symbol table is still
144: unencrypted. 1/81 ***/
145: The building of the symbol table is simple-minded.
146: Oh well.
147:
148: 11) It should be available on a micro.
149: /* Not yet. But the thinking has begun! */
150: /* This will necessitate some rearchitecture
151: especially wrt buffering of routines/strings */
152: /* Object table caching required */
153:
154: 12) The ACTION routine for verbs should execute AFTER the action
155: routine for your room; this enables east(ACTION) to correctly
156: default to ($say "Can't go that way.") and allow one to generally
157: live without $hit and $miss, crocky routines that they are.
158: See ../sample (espec. transit.ddl) for a specimen of how this works.
159:
160: /* 11/80 */
161:
162: 13) Routines that get the action and preaction routines for verbs
163: should be made available.
164:
165: 14) Fuses and daemons aren't QUITE right (fuses go off after your daemon
166: has typed a prompt, for a real-world example). Maybe they
167: shd be on a homogenized priority queue?
168:
169: 15) It should be frozen real soon.
170: /* As of 1/81, we're STILL thinking in terms
171: of "just this ONE more feature..." Damn. */
172:
173: 16) 3/82: Modern versions of Unix permit various forms of interprocess
174: communication and commutators of some variety or another. Mpx
175: channels in 32/V and 4.1bsd, UCB's future IPC mechanism for 4.2bsd,
176: named pipes (?) in 3.0, etc, etc. One wonders how much work it
177: would be to turn DDL into MUD-DL (multi-user dungeon definition
178: language)! Example of changes: The single variable .ME now
179: has some cousins, .ME1 thru .ME8. The parser sees not only the
180: input, but who's responsible, and sets .ME to the appropriate
181: .ME[n]. Then you just go through the turn normally. Routines
182: like "$say" implicitly go to the .ME[x] currently associated
183: with .ME (thus, to talk to someone else, temporarily reassign .ME;
184: since .ME is an object, not a global, this means that you
185: add $setme and $whoami. Also, a string-valued function for
186: $myname) Globals 1-100 are as always, but globals 101-125 are
187: implicitly local to the current .ME who's doing something. This
188: is the easy part. The hard part is figuring out how to say
189: "Tell everyone in the room that a Troll has entered", or
190: "Tell everyone in the room but .ME that .ME got fried by the
191: dragon". Worse, how do you handle it when two or more people
192: are required to push on a door to open it? How do daemons, fuses
193: and turn counters work? It's nice do have names for the various
194: .MEs; but this requires dynamically fudging their SDESCs. Chris
195: Kostanick has thought about multiplayer games in general; Mike
196: Urban has played Essex MUD. We've both matured since DDL was
197: written, so maybe now's the time!
198: Mike
199:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.