Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/cml/doc/HTML/cml.html
ViewVC logotype

Annotation of /sml/trunk/src/cml/doc/HTML/cml.html

Parent Directory Parent Directory | Revision Log Revision Log


Revision 844 - (view) (download) (as text)

1 : monnier 8 <!-- HTML/cml.html -->
2 : monnier 2
3 : monnier 106 <!-- COPYRIGHT (c) 1998 Bell Labs, Lucent Technologies. -->
4 : monnier 2 <!-- COPYRIGHT (c) 1995 AT\|@AMP\|T Bell Laboratories. -->
5 :     <!-- COPYRIGHT (c) 1991 John H. Reppy. -->
6 :    
7 :     <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.2//EN">
8 :     <HTML>
9 :     <HEAD>
10 :     <TITLE>The CML structure</TITLE>
11 :     </HEAD>
12 : monnier 106 <BODY><A NAME="top"></A>
13 : monnier 8 <H1 align=CENTER>The Concurrent ML Reference Manual</H1>
14 : monnier 2 <HR>
15 :    
16 : monnier 8
17 : monnier 106 <H2><A NAME="section:0">The <CODE>CML</CODE> structure</A></H2>
18 : monnier 2 <HR>
19 :     <H4>Synopsis</H4>
20 :     <BLOCKQUOTE>
21 :     <CODE><B>signature </B><A NAME="CML:SIG:SPEC"><CODE>CML</CODE></A><BR>
22 :     <B>structure </B><A NAME="CML:STR:SPEC"><CODE>CML</CODE></A><B> : </B>CML<BR>
23 :     </CODE>
24 :     </BLOCKQUOTE>
25 :     <HR>
26 :     <H4>Interface</H4>
27 :     <BLOCKQUOTE>
28 :     <CODE><B>type</B> <A NAME="SIG:CML.thread_id:TY:SPEC" HREF="#SIG:CML.thread_id:TY">thread_id</A><BR>
29 :     <B>type</B> 'a <A NAME="SIG:CML.chan:TY:SPEC" HREF="#SIG:CML.chan:TY">chan</A><BR>
30 :     <B>type</B> 'a <A NAME="SIG:CML.event:TY:SPEC" HREF="#SIG:CML.event:TY">event</A><BR>
31 :     <B>val</B> <A NAME="SIG:CML.version:VAL:SPEC" HREF="#SIG:CML.version:VAL">version</A> <B>:</B> {system : string, version_id : int list, date : string} <BR>
32 :     <B>val</B> <A NAME="SIG:CML.banner:VAL:SPEC" HREF="#SIG:CML.version:VAL">banner</A> <B>:</B> string <BR>
33 :     <B>val</B> <A NAME="SIG:CML.spawnc:VAL:SPEC" HREF="#SIG:CML.spawnc:VAL">spawnc</A> <B>:</B> ('a -&gt; unit) -&gt; 'a -&gt; thread_id <BR>
34 :     <B>val</B> <A NAME="SIG:CML.spawn:VAL:SPEC" HREF="#SIG:CML.spawnc:VAL">spawn</A> <B>:</B> (unit -&gt; unit) -&gt; thread_id <BR>
35 :     <B>val</B> <A NAME="SIG:CML.yield:VAL:SPEC" HREF="#SIG:CML.yield:VAL">yield</A> <B>:</B> unit -&gt; unit <BR>
36 :     <B>val</B> <A NAME="SIG:CML.exit:VAL:SPEC" HREF="#SIG:CML.exit:VAL">exit</A> <B>:</B> unit -&gt; 'a <BR>
37 :     <B>val</B> <A NAME="SIG:CML.getTid:VAL:SPEC" HREF="#SIG:CML.getTid:VAL">getTid</A> <B>:</B> unit -&gt; thread_id <BR>
38 :     <B>val</B> <A NAME="SIG:CML.sameTid:VAL:SPEC" HREF="#SIG:CML.sameTid:VAL">sameTid</A> <B>:</B> (thread_id * thread_id) -&gt; bool <BR>
39 :     <B>val</B> <A NAME="SIG:CML.compareTid:VAL:SPEC" HREF="#SIG:CML.compareTid:VAL">compareTid</A> <B>:</B> (thread_id * thread_id) -&gt; order <BR>
40 :     <B>val</B> <A NAME="SIG:CML.hashTid:VAL:SPEC" HREF="#SIG:CML.hashTid:VAL">hashTid</A> <B>:</B> thread_id -&gt; word <BR>
41 :     <B>val</B> <A NAME="SIG:CML.tidToString:VAL:SPEC" HREF="#SIG:CML.tidToString:VAL">tidToString</A> <B>:</B> thread_id -&gt; string <BR>
42 :     <B>val</B> <A NAME="SIG:CML.joinEvt:VAL:SPEC" HREF="#SIG:CML.joinEvt:VAL">joinEvt</A> <B>:</B> thread_id -&gt; unit event <BR>
43 :     <B>val</B> <A NAME="SIG:CML.channel:VAL:SPEC" HREF="#SIG:CML.channel:VAL">channel</A> <B>:</B> unit -&gt; 'a chan <BR>
44 :     <B>val</B> <A NAME="SIG:CML.sameChannel:VAL:SPEC" HREF="#SIG:CML.sameChannel:VAL">sameChannel</A> <B>:</B> ('a chan * 'a chan) -&gt; bool <BR>
45 :     <B>val</B> <A NAME="SIG:CML.send:VAL:SPEC" HREF="#SIG:CML.send:VAL">send</A> <B>:</B> ('a chan * 'a) -&gt; unit <BR>
46 :     <B>val</B> <A NAME="SIG:CML.recv:VAL:SPEC" HREF="#SIG:CML.recv:VAL">recv</A> <B>:</B> 'a chan -&gt; 'a <BR>
47 :     <B>val</B> <A NAME="SIG:CML.sendEvt:VAL:SPEC" HREF="#SIG:CML.sendEvt:VAL">sendEvt</A> <B>:</B> ('a chan * 'a) -&gt; unit event <BR>
48 :     <B>val</B> <A NAME="SIG:CML.recvEvt:VAL:SPEC" HREF="#SIG:CML.sendEvt:VAL">recvEvt</A> <B>:</B> 'a chan -&gt; 'a event <BR>
49 : monnier 8 <B>val</B> <A NAME="SIG:CML.sendPoll:VAL:SPEC" HREF="#SIG:CML.sendPoll:VAL">sendPoll</A> <B>:</B> ('a chan * 'a) -&gt; bool <BR>
50 : monnier 2 <B>val</B> <A NAME="SIG:CML.recvPoll:VAL:SPEC" HREF="#SIG:CML.recvPoll:VAL">recvPoll</A> <B>:</B> 'a chan -&gt; 'a option <BR>
51 :     <B>val</B> <A NAME="SIG:CML.wrap:VAL:SPEC" HREF="#SIG:CML.wrap:VAL">wrap</A> <B>:</B> ('a event * ('a -&gt; 'b)) -&gt; 'b event <BR>
52 :     <B>val</B> <A NAME="SIG:CML.wrapHandler:VAL:SPEC" HREF="#SIG:CML.wrapHandler:VAL">wrapHandler</A> <B>:</B> ('a event * (exn -&gt; 'a event)) -&gt; 'a event <BR>
53 :     <B>val</B> <A NAME="SIG:CML.guard:VAL:SPEC" HREF="#SIG:CML.guard:VAL">guard</A> <B>:</B> (unit -&gt; 'a event) -&gt; 'a event <BR>
54 :     <B>val</B> <A NAME="SIG:CML.withNack:VAL:SPEC" HREF="#SIG:CML.withNack:VAL">withNack</A> <B>:</B> (unit event -&gt; 'a event) -&gt; 'a event <BR>
55 :     <B>val</B> <A NAME="SIG:CML.choose:VAL:SPEC" HREF="#SIG:CML.choose:VAL">choose</A> <B>:</B> 'a event list -&gt; 'a event <BR>
56 :     <B>val</B> <A NAME="SIG:CML.sync:VAL:SPEC" HREF="#SIG:CML.sync:VAL">sync</A> <B>:</B> 'a event -&gt; 'a <BR>
57 :     <B>val</B> <A NAME="SIG:CML.select:VAL:SPEC" HREF="#SIG:CML.select:VAL">select</A> <B>:</B> 'a event list -&gt; 'a <BR>
58 :     <B>val</B> <A NAME="SIG:CML.never:VAL:SPEC" HREF="#SIG:CML.never:VAL">never</A> <B>:</B> 'a event <BR>
59 :     <B>val</B> <A NAME="SIG:CML.alwaysEvt:VAL:SPEC" HREF="#SIG:CML.alwaysEvt:VAL">alwaysEvt</A> <B>:</B> 'a -&gt; 'a event <BR>
60 :     <B>val</B> <A NAME="SIG:CML.timeOutEvt:VAL:SPEC" HREF="#SIG:CML.timeOutEvt:VAL">timeOutEvt</A> <B>:</B> Time.time -&gt; unit event <BR>
61 :     <B>val</B> <A NAME="SIG:CML.atTimeEvt:VAL:SPEC" HREF="#SIG:CML.atTimeEvt:VAL">atTimeEvt</A> <B>:</B> Time.time -&gt; unit event <BR>
62 :     </CODE>
63 :     </BLOCKQUOTE>
64 :     <H4>Description</H4>
65 :     <DL>
66 :     <DT> <A NAME="SIG:CML.thread_id:TY"><CODE><B>type</B> thread_id</CODE></A>
67 :     <DD>
68 : monnier 106 Thread IDs are the unique IDs associated with CML threads. These IDs are in an unspecified total order that can be used to break cyclic depedencies (see <A HREF="cml.html#SIG:CML.compareTid:VAL:SPEC">compareTid</A>).
69 : monnier 2 <BR>
70 :     <BR>
71 :    
72 :     <DT> <A NAME="SIG:CML.chan:TY"><CODE><B>type</B> 'a chan</CODE></A>
73 :     <DD>
74 : monnier 106 This is the type constructor for synchronous channels.
75 : monnier 2 <BR>
76 :     <BR>
77 :    
78 :     <DT> <A NAME="SIG:CML.event:TY"><CODE><B>type</B> 'a event</CODE></A>
79 :     <DD>
80 : monnier 106 Event values are abstract representations of synchronous operations (so called <EM>first-class sychronous operations</EM>).
81 : monnier 2 <BR>
82 :     <BR>
83 :    
84 :     <DT> <A NAME="SIG:CML.version:VAL"><CODE><B>val</B> version</CODE></A>
85 :     <DT> <CODE><B>val</B> banner</CODE>
86 :     <DD>
87 : monnier 106 These specify the version of CML in the same format as SML/NJ.
88 : monnier 2 <BR>
89 :     <BR>
90 :    
91 :     <DT> <A NAME="SIG:CML.spawnc:VAL"><CODE>spawnc <VAR>f</VAR> <VAR>x</VAR>
92 :     </CODE></A>
93 :     <DT> <CODE> spawn <VAR>f</VAR>
94 :     </CODE>
95 :     <DD>
96 :     creates a new thread of control to evaluate the body of <VAR>f</VAR>. A new unique ID for the thread is created and returned.
97 :     <BR>
98 :     <BR>
99 :    
100 :     <DT> <A NAME="SIG:CML.yield:VAL"><CODE><B>val</B> yield</CODE></A>
101 :     <DD>
102 : monnier 106 This function can be used to implement an explicit context switch. Since CML is preemptively scheduled, it should never be necessary for user programs to call this function. It is mainly used for performance measurements.
103 : monnier 2 <BR>
104 :     <BR>
105 :    
106 :     <DT> <A NAME="SIG:CML.exit:VAL"><CODE>exit ()
107 :     </CODE></A>
108 :     <DD>
109 :     causes the calling thread to terminate.
110 :     <BR>
111 :     <BR>
112 :    
113 :     <DT> <A NAME="SIG:CML.getTid:VAL"><CODE>getTid ()
114 :     </CODE></A>
115 :     <DD>
116 :     returns the thread ID of the calling thread.
117 :     <BR>
118 :     <BR>
119 :    
120 :     <DT> <A NAME="SIG:CML.sameTid:VAL"><CODE>sameTid (<VAR>tid1</VAR>, <VAR>tid2</VAR>)
121 :     </CODE></A>
122 :     <DD>
123 : blume 844 returns <CODE>true</CODE>, if the two thread IDs are the same ID.
124 : monnier 2 <BR>
125 :     <BR>
126 :    
127 :     <DT> <A NAME="SIG:CML.compareTid:VAL"><CODE>compareTid (<VAR>tid1</VAR>, <VAR>tid2</VAR>)
128 :     </CODE></A>
129 :     <DD>
130 :     compares the two thread IDs and returns their order in the total ordering of thread IDs. The precise semantics of this ordering is left unspecified, other than to say it is a total order.
131 :     <BR>
132 :     <BR>
133 :    
134 :     <DT> <A NAME="SIG:CML.hashTid:VAL"><CODE>hashTid <VAR>tid</VAR>
135 :     </CODE></A>
136 :     <DD>
137 :     returns a hashing of the thread ID <VAR>tid</VAR>.
138 :     <BR>
139 :     <BR>
140 :    
141 :     <DT> <A NAME="SIG:CML.tidToString:VAL"><CODE>tidToString <VAR>tid</VAR>
142 :     </CODE></A>
143 :     <DD>
144 :     returns a string representation of the thread ID <VAR>tid</VAR>.
145 :     <BR>
146 :     <BR>
147 :    
148 :     <DT> <A NAME="SIG:CML.joinEvt:VAL"><CODE>joinEvt <VAR>tid</VAR>
149 :     </CODE></A>
150 :     <DD>
151 : blume 844 creates an event value for synchronizing on the termination of the thread with the ID <VAR>tid</VAR>. There are three ways that a thread may terminate: the function that was passed to <A HREF="cml.html#SIG:CML.spawn:VAL:SPEC">spawn</A> (or <A HREF="cml.html#SIG:CML.spawnc:VAL:SPEC">spawnc</A>) may return; it may call the <A HREF="cml.html#SIG:CML.exit:VAL:SPEC">exit</A> function, or it may have an uncaught exception. Note that joinEvt does not distinguish between these cases; it also does not become enabled if the named thread deadlocks (even if it is garbage collected).
152 : monnier 2 <BR>
153 :     <BR>
154 :    
155 :     <DT> <A NAME="SIG:CML.channel:VAL"><CODE>channel ()
156 :     </CODE></A>
157 :     <DD>
158 :     creates a new synchronous channel.
159 :     <BR>
160 :     <BR>
161 :    
162 :     <DT> <A NAME="SIG:CML.sameChannel:VAL"><CODE>sameChannel (<VAR>ch1</VAR>, <VAR>ch2</VAR>)
163 :     </CODE></A>
164 :     <DD>
165 : blume 844 returns <CODE>true</CODE>, if the two channels are the same channel.
166 : monnier 2 <BR>
167 :     <BR>
168 :    
169 : blume 844 <DT> <A NAME="SIG:CML.send:VAL"><CODE>send (<VAR>ch</VAR>, <VAR>msg</VAR>)
170 : monnier 2 </CODE></A>
171 :     <DD>
172 : blume 844 sends the message <VAR>msg</VAR> on the synchronous channel <VAR>ch</VAR>. This operation blocks the calling thread until there is another thread attempting to receive a message from the channel <VAR>ch</VAR>, at which point the receiving thread gets the message and both threads continue execution.
173 : monnier 2 <BR>
174 :     <BR>
175 :    
176 :     <DT> <A NAME="SIG:CML.recv:VAL"><CODE>recv <VAR>ch</VAR>
177 :     </CODE></A>
178 :     <DD>
179 : blume 844 receives a message from the channel <VAR>ch</VAR>. This operation blocks the calling thread until there is another thread attempting to send a message on the channel <VAR>ch</VAR>, at which point both threads continue execution.
180 : monnier 2 <BR>
181 :     <BR>
182 :    
183 :     <DT> <A NAME="SIG:CML.sendEvt:VAL"><CODE><B>val</B> sendEvt</CODE></A>
184 :     <DT> <CODE><B>val</B> recvEvt</CODE>
185 :     <DD>
186 : monnier 106 These functions create event values to represent the <A HREF="cml.html#SIG:CML.send:VAL:SPEC">send</A> and <A HREF="cml.html#SIG:CML.recv:VAL:SPEC">recv</A> operations.
187 : monnier 2 <BR>
188 :     <BR>
189 :    
190 : blume 844 <DT> <A NAME="SIG:CML.sendPoll:VAL"><CODE>sendPoll (<VAR>ch</VAR>, <VAR>msg</VAR>)
191 : monnier 8 </CODE></A>
192 :     <DD>
193 : blume 844 attempts to send the message <VAR>msg</VAR> on the synchronous channel <VAR>ch</VAR>. If this operation can complete without blocking the calling thread, then the message is sent and <CODE>true</CODE> is returned. Otherwise, no communication is preformed and <CODE>false</CODE> is returned. This function is not recommended for general use; it is provided as an efficiency aid for certain kinds of protocols.
194 : monnier 8 <BR>
195 :     <BR>
196 :    
197 : monnier 2 <DT> <A NAME="SIG:CML.recvPoll:VAL"><CODE>recvPoll <VAR>ch</VAR>
198 :     </CODE></A>
199 :     <DD>
200 : monnier 8 attempts to receive a message from the channel <VAR>ch</VAR>. If there is no other thread offering to <A HREF="cml.html#SIG:CML.send:VAL:SPEC">send</A> a message on <VAR>ch</VAR>, then this returns <A HREF="http://www.cs.bell-labs.com/~jhr/sml/basis/pages/option.html#SIG:OPTION.option:TY:SPEC">NONE</A>, otherwise it returns <A HREF="http://www.cs.bell-labs.com/~jhr/sml/basis/pages/option.html#SIG:OPTION.option:TY:SPEC">SOME</A> wrapped around the message. This function is not recommended for general use; it is provided as an efficiency aid for certain kinds of protocols.
201 : monnier 2 <BR>
202 :     <BR>
203 :    
204 :     <DT> <A NAME="SIG:CML.wrap:VAL"><CODE>wrap (<VAR>ev</VAR>, <VAR>f</VAR>)
205 :     </CODE></A>
206 :     <DD>
207 :     wraps the post-synchronization action <VAR>f</VAR> around the event value <VAR>ev</VAR>.
208 :     <BR>
209 :     <BR>
210 :    
211 : blume 844 <DT> <A NAME="SIG:CML.wrapHandler:VAL"><CODE>wrapHandler (<VAR>ev</VAR>, <VAR>h</VAR>)
212 : monnier 2 </CODE></A>
213 :     <DD>
214 : blume 844 wraps the exception handler function <VAR>h</VAR> around the event value <VAR>ev</VAR>. If, during execution of some post-synchronization action in <VAR>ev</VAR>, an exception is raised, it will be caught and passed to <VAR>h</VAR>. Nesting of handlers works as would be expected: the innermost handler is the first one invoked. Note that exceptions raised in the pre-synchronization actions in <VAR>ev</VAR> (i.e., actions defined by <A HREF="cml.html#SIG:CML.guard:VAL:SPEC">guard</A> and <A HREF="cml.html#SIG:CML.withNack:VAL:SPEC">withNack</A>) are not handled by <VAR>h</VAR>.
215 : monnier 2 <BR>
216 :     <BR>
217 :    
218 : blume 844 <DT> <A NAME="SIG:CML.guard:VAL"><CODE>guard <VAR>g</VAR>
219 : monnier 2 </CODE></A>
220 :     <DD>
221 : blume 844 creates a <I>delayed</I> event value from the function <VAR>g</VAR>. When the resulting event value is synchronized on, the function <VAR>g</VAR> will be evaluated and the resulting event value will be used in its place in the synchronization. This provides a mechanism for implementing pre-synchronization actions, such as sending a request to a server.
222 : monnier 2 <BR>
223 :     <BR>
224 :    
225 : blume 844 <DT> <A NAME="SIG:CML.withNack:VAL"><CODE>withNack <VAR>g</VAR>
226 : monnier 2 </CODE></A>
227 :     <DD>
228 : blume 844 creates a <I>delayed</I> event value from the function <VAR>g</VAR>. As in the case of <A HREF="cml.html#SIG:CML.guard:VAL:SPEC">guard</A>, the function <VAR>g</VAR> will be evaluated at synchronization time and the resulting event value will be used in its place in the synchronization. Furthermore, when <VAR>g</VAR> is evaluated, it is passed a <I>negative acknowledgement</I> event as an argument. This negative acknowledgement event is enabled in the case where some other event involved in the synchronization is chosen instead of the one produced by <VAR>g</VAR>. The withNack combinator provides a mechanism for informing servers that a client has aborted a transaction.
229 : monnier 2 <BR>
230 :     <BR>
231 :    
232 : blume 844 <DT> <A NAME="SIG:CML.choose:VAL"><CODE>choose <VAR>evs</VAR>
233 : monnier 2 </CODE></A>
234 :     <DD>
235 : blume 844 constructs an event value that represents the non-deterministic choice of the events in the list <VAR>evs</VAR>.
236 : monnier 2 <BR>
237 :     <BR>
238 :    
239 :     <DT> <A NAME="SIG:CML.sync:VAL"><CODE>sync <VAR>ev</VAR>
240 :     </CODE></A>
241 :     <DD>
242 :     synchronizes the calling thread on the event <VAR>ev</VAR>.
243 :     <BR>
244 :     <BR>
245 :    
246 :     <DT> <A NAME="SIG:CML.select:VAL"><CODE>select <VAR>evs</VAR>
247 :     </CODE></A>
248 :     <DD>
249 : blume 844 synchronizes on the non-deterministic choice of the events in the list <VAR>evs</VAR>. It is semantically equivalant to:
250 : monnier 2 <PRE>
251 :     <A HREF="cml.html#SIG:CML.sync:VAL:SPEC">sync</A> (<A HREF="cml.html#SIG:CML.choose:VAL:SPEC">choose</A> <VAR>evs</VAR>)
252 :    
253 :     </PRE>
254 :     but is more efficient.
255 :     <BR>
256 :     <BR>
257 :    
258 :     <DT> <A NAME="SIG:CML.never:VAL"><CODE>never
259 :     </CODE></A>
260 :     <DD>
261 :     is an event value that is never enabled for synchronization. It is semantically equivalant to the expression:
262 :     <PRE>
263 :     <A HREF="cml.html#SIG:CML.choose:VAL:SPEC">choose</A> []
264 :    
265 :     </PRE>
266 :    
267 :     <BR>
268 :     <BR>
269 :    
270 : blume 844 <DT> <A NAME="SIG:CML.alwaysEvt:VAL"><CODE>alwaysEvt <VAR>x</VAR>
271 : monnier 2 </CODE></A>
272 :     <DD>
273 : blume 844 creates an event value that is always enabled, and that returns the value <VAR>x</VAR> upon synchronization.
274 : monnier 2 <BR>
275 :     <BR>
276 :    
277 :     <DT> <A NAME="SIG:CML.timeOutEvt:VAL"><CODE>timeOutEvt <VAR>t</VAR>
278 :     </CODE></A>
279 :     <DD>
280 :     creates an event value that becomes enabled at the time interval <VAR>t</VAR> after synchronization. For example, the expression:
281 :     <PRE>
282 : monnier 8 <A HREF="cml.html#SIG:CML.sync:VAL:SPEC">sync</A> (timeOutEvt (<A HREF="http://www.cs.bell-labs.com/~jhr/sml/basis/pages/time.html#SIG:TIME.fromSeconds:VAL:SPEC">Time.fromSeconds</A> 1))
283 : monnier 2
284 :     </PRE>
285 :     will delay the calling thread for one second. Note that the specified time interval is actually a minimum waiting time, and the delay may be longer.
286 :     <BR>
287 :     <BR>
288 :    
289 :     <DT> <A NAME="SIG:CML.atTimeEvt:VAL"><CODE>atTimeEvt <VAR>t</VAR>
290 :     </CODE></A>
291 :     <DD>
292 : monnier 289 creates an event value that becomes enabled at the specified time <VAR>t</VAR>. For example, the expression:
293 :     <PRE>
294 :     <A HREF="cml.html#SIG:CML.sync:VAL:SPEC">sync</A> (atTimeEvt (<A HREF="http://www.cs.bell-labs.com/~jhr/sml/basis/pages/date.html#SIG:DATE.toTime:VAL:SPEC">Date.toTime</A> (<A HREF="http://www.cs.bell-labs.com/~jhr/sml/basis/pages/date.html#SIG:DATE.date:VAL:SPEC">Date.date</A> {
295 :     year = 2000, month = <A HREF="http://www.cs.bell-labs.com/~jhr/sml/basis/pages/date.html#SIG:DATE.month:TY:SPEC">Date.Jan</A>, day = 0,
296 :     hour = 0, minute = 0, second = 0,
297 :     offset = NONE
298 :     })))
299 :    
300 :     </PRE>
301 :     blocks the calling thread until the beginning of the year 2000.
302 : monnier 2 <BR>
303 :     <BR>
304 :    
305 :     </DL>
306 :     <HR>
307 :     <H4>See Also</H4>
308 :     <BLOCKQUOTE>
309 : monnier 8 <A HREF="http://www.cs.bell-labs.com/~jhr/sml/basis/pages/option.html#Option:STR:SPEC">Option</A>, <A HREF="http://www.cs.bell-labs.com/~jhr/sml/basis/pages/time.html#Time:STR:SPEC">Time</A>
310 : monnier 2 </BLOCKQUOTE>
311 : monnier 8
312 :    
313 : monnier 2 <HR>
314 : monnier 8 <CENTER>
315 : monnier 106 <B>[ <A HREF="#top">Top</A>
316 :     | <A HREF="core-cml.html">Parent</A>
317 :     | <A HREF="toc.html">Contents</A>
318 :     | <A HREF="index-all.html">Index</A>
319 :     | <A HREF="refman.html">Root</A>
320 : monnier 2 ]</B>
321 : monnier 8 </CENTER>
322 : monnier 2 <P>
323 : monnier 106 <I>Last Modified &date;</I><BR>
324 : monnier 8 <I>Comments to <A HREF="mailto:jhr@research.bell-labs.com">John Reppy.</A></I><BR>
325 :    
326 : monnier 106 Copyright &copy; 1998 Bell Labs, Lucent Technologies <BR>
327 : monnier 8
328 : monnier 2 <HR>
329 : monnier 106 </BODY></HTML>

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0