0.1THEINTERLISP-DPROCESSMECHANISMTheInterlisp-DProcessmechanismprovidesanenvironmentinwhichmultipleLispprocessescanruninparallel.Eachexecutesinitsownstackspace,butallshareaglobaladressspace.Thecurrentprocessimplementationiscooperative;i.e.,processswitcheshappenvoluntarily,eitherwhentheprocessincontrolhasnothingtodoorwhenitisinaconvenientplacetopause.Thereisnopreemptionorguaranteedservice,soyoucannotrunsomethingdemanding(e.g.,Chat)atthesametimeassomethingthatrunsforlongperiodswithoutyieldingcontrol.Keyboardinputandnetworkoperationsblockwithgreatfrequency,soprocessescurrentlyworkbestforhighlyinteractivetasks(editing,makingremoteles).InInterlisp-D,theprocessmechanismisalreadyturnedon,andisexpectedtostayonduringnormaloperations,assomesystemfacilities(inparticular,mostnetworkoperations)requireit.However,underexceptionalconditions,thefollowingfunctioncanbeusedtoturntheworldoandon:[Function]Startsuptheprocessworld,orif=,killsallprocessesandturnsito.Normallydoesnotreturn.Theenvironmentstartsoutwithtwoprocesses:atop-level(theinitial``tty''process)andthe``background''process,whichrunsthewindowmousehandlerandothersystembackgroundtasks.Aautomaticallyturnstheprocessworldon(orresetsitifitwason),unlessthevariableis.Note:isintendedtobecalledatthetoplevelofInterlisp,notfromwithinaprogram.Itdoesnottogglesomesortofswitch;rather,itconstructssomenewprocessesinanewpartofthestack,leavinganycallersofinanowinaccessiblepartofthestack.Callingistheonlywaythecalltoeverreturns.0.1.1CreatingandDestroyingProcesses[NoSpreadFunction]Createsanewprocessevaluating,andreturnsitsprocesshandle.Theprocess'sstackenvironmentisthetoplevel,i.e.,thenewprocessdoesnothaveaccesstotheenvironmentinwhichwascalled;allsuchinformationmustbepassedasargumentsin.Theprocessrunsuntilreturnsortheprocessisexplicitlydeleted.Anuntrappederrorwithintheprocessalsodeletestheprocess(unlessitspropertyis),inwhichcaseamessageisprintedtothateect.Theremainingargumentsarealternatelypropertynamesandvalues.Anyproperty/valuepairsacceptabletomaybegiven,butthefollowingtwoaredirectlyrelevantto:Valueshouldbealitatom;ifnotgiven,theprocessnameistakenfrom.maypackthenamewithanumbertomakeitunique.ThisnameissolelyfortheconvenienceofmanipulatingprocessesatLisptypein;e.g.,thenamecanbegivenastheargumenttomostprocessfunctions,andthenameappearsinmenusofprocesses.However,programsshouldnormallyonlydealinprocesshandles,bothfor0.1(PROCESSWORLD)OFFEVALQTHARDRESETAUTOPROCESSFLGNILPROCESSWORLDPROCESSWORLD(PROCESSWORLD'OFF)PROCESSWORLD(ADD.PROCESS)ADD.PROCESSRESTARTABLETPROCESSPROPADD.PROCESSNAME(CAR)ADD.PROCESSFLGFLGFORMPROP1VALUE1PROPNVALUENFORMFORMFORMFORMPROC|\8 i #xW  "%1' /04:'=6C%EH0V- XDX"&)+/>0z48=M@6ET  2#)2. 5/9<>CE/R  qUmBn '+-R157z9 @B Q< /2 '+:/ 026i9;/ADGO   '4*-^2 9&<?C M  } $H *.J38=:J  AY" #(-/2d39;>w@E%IF H 1"` (,W1 8=?EG # u %(*n-/T2V48:=jDC5 B $)3+/j3479?BzF GlAO!#(Y+9 3J69b<?9 EF? i#8'*/2o4 =BF>%m#) +/47 ;@<^ J$&+/24w8w:;=*@ C(G:)-7' (.02779;>BD 6 L"X#*[,/f2 6T:<>CH4h *!$*,.1 4 58X|, i }(S#v$$x<C&>!n& 025 :<A3G%q! ))*-1/36A8;@DF#a)m 'Z(69=q?EBZ !)5!#~*C/038~;COH  %+,-m37Y;=BEOp#/t57w8:>AC Hsv# !(+ 28=@F  !$L *6<90;?ACzP!&1u %3':({-/>158f=MA"BFy%;047:->!ApBH0) T!&* -/]3E57 ?A "u#&+.U04:68}<=C `!& -302|6T;v=>AC 8"(- 258:g?&DxG(} P`m$xD B1Y?>A: *7) 2 >m 1, (S /#a, p% 6 , z(| u$d& "} P`m$RxD5B,l-(SQ'(S b'"(S%'')G(S++-U'.&-Y.!, ,?? !?A} 4`m$^CreatingandDestroyingProcesseseciencyandtoavoidtheconfusionthatcanresultiftwoprocesseshavethesamedeningform.Ifthevalueisnon-,thenewprocessiscreatedbutthenimmediatelysuspended;i.e.,theprocessdoesnotactuallyrununtilwokenbya(below).[NoSpreadFunction]Usedtogetorsetthevaluesofcertainpropertiesofprocess,inamanneranalogousto.Ifissupplied(includingifitis),propertyisgiventhatvalue.Inallcases,returnstheoldvalueoftheproperty.Thefollowingpropertieshavespecialmeaningforprocesses;allothersareuninterpreted:Valueisalitatomusedforidentifyingtheprocesstotheuser.Valueisaagindicatingthedispositionoftheprocessfollowingerrorsorhardresets:or(thedefault)Ifanuntrappederror(or^Eor^D)causesitsformtobeexited,theprocessisdeleted.Theprocessisalsodeletedifa(or^Dfrom)occurs,causingtheentireProcessworldtobereinitialized.orTheprocessisautomaticallyrestartedonerrorsor.Thisisthenormalsettingforpersistent``background''processes,suchasthemouseprocess,thatcansafelyrestartthemselvesonerrors.Theprocessisdeletedasusualifanerrorcausesitsformtobeexited,butitrestartedona.Thissettingispreferredforpersistentprocessesforwhichanerrorisanunusualcondition,onethatmightrepeatitselfiftheprocessweresimplyblindlyrestarted.ValueistheLispformusedtostarttheprocess(readonly).ValueindicatesthedispositionoftheprocessfollowingaresumptionofLispaftersomeexit(,,).Possiblevaluesare:Deletetheprocess.Suspendtheprocess;i.e.,donotletitrununtilitisexplicitlywoken.0.2SUSPENDNILWAKE.PROCESS(PROCESSPROP)WINDOWPROPNILNAMERESTARTABLENILNOHARDRESETRAIDTYESHARDRESETHARDRESETisHARDRESETFORMAFTEREXITLOGOUTSYSOUTMAKESYSDELETESUSPENDPROCPROPNEWVALUEPROCNEWVALUEPROP|b'0$'b .Ux\:"%U'*-$3k6:8<=@FZ"o'U# $;%*+.B1867B TD $Q'X*/@25; =AF]HR'1O<CMH]!0#\%*+0a 68@ACDLMI()24:e A*BD[HJ!#?'/*:/!1.3\7r<`>AEGI & -o05I:=8 CEG\ DW !#'+-@ 4*6;V=?`? !#% ,.b 5H69V>"D+H>;9[ #)*,3t69M;=Y@;DFy7 "$(+M01|69>f?BGZH6) +E-4Q5K9>AE4j $&( 1e/ $) * 3G9;U?|I. $>%([->140 : C ,s $X&3(-B258S<]@ G* &# #(*}/s1F568<7@BFG$} %W'*U/1:r;7>9BC" #6 )Z/P157:ECl !1 #' +K/3i57<@vE/  !$R'j*./259  &{( 014`9R?@ H&6"&w) .4;G<BF9 %^' &)X.1468:}=K@BWC : (!}`m$xWU(oR O $LM 4 FDWAQ ;!c6 01e/Ar'{$})x26)/5f0 }`m$^xOV "uM=?3LM+s.0J{"}0 `m$0Causetheprocesstobesuspendedwaitingfortheevent(pageX.XX).Valueisafunctionorformusedtoprovideinformationabouttheprocess,inconjunctionwiththeprocessstatuswindow(pageX.XX).Valueisawindowassociatedwiththeprocess,theprocess's``main''window.Usedinconjunctionwithswitchingthettyprocess(pageX.XX).Valueisafunctionthatisappliedtotheprocesswhentheprocessismadethettyprocess(pageX.XX).Valueisafunctionthatisappliedtotheprocesswhentheprocessceasestobethettyprocess(pageX.XX).[Function]Returnsthehandleofthecurrentlyrunningprocess,oriftheProcessworldisturnedo.[Function]Deletesprocess.maybeaprocesshandle(returnedby),oritsname.Notethatifisthecurrentlyrunningprocess,doesnotreturn![Function]Terminatesthecurrentlyrunningprocess,causingitto``return''.Thereisanimplicitaroundtheargumentgivento,sothatnormallyaprocesscannishbysimplyreturning;issuppliedforearliertermination.[Function]Ifhasterminated,returnsthevalue,ifany,thatitreturned.Thisiseitherthevalueofaorthevaluereturnedfromtheformgivento.Iftheprocesswasaborted,thevalueis.Ifistrue,blocksuntilnishes,ifnecessary;otherwise,itreturnsimmediatelyifisstillrunning.Notethatmustbetheactualprocesshandlereturnedfrom,notaprocessname,astheassociationbetweenhandleandnamedisappearswhentheprocessnishes(andtheprocesshandleitselfisthengarbagecollectedifnooneelsehasapointertoit).[Function]Trueifhasterminated.Thevaluereturnedisanindicationofhowitnished:or.0.3INFOHOOKWINDOWTTYENTRYFNTTYEXITFN(THIS.PROCESS)NIL(DEL.PROCESS)ADD.PROCESSDEL.PROCESS(PROCESS.RETURN)PROCESS.RETURNADD.PROCESSPROCESS.RETURN(PROCESS.RESULT)PROCESS.RETURNADD.PROCESSNILPROCESS.RESULTNILADD.PROCESS(PROCESS.FINISHEDP)NORMALERRORPROCPROCPROCPROCVALUEVALUEFORMPROCESSWAITFORRESULTPROCESSWAITFORRESULTPROCESSPROCESSPROCESSPROCESSPROCESSx\86Z %P',.18 =?B0F!X TA |!"(Y* -b02+7# >BgDRD %(+3038<M `!"' -027:/?D_LK (! )N,f2t46;?mG ~!"(`+ ,}1W25H: =@DF!E!%)AO "#5(+,135:>@E?D 3"$)q--AE9Y~4C5 3Nd$s(+-.357=xH1|i#j&I+-9/5:0G,C5 +X  &+0568 ABFG)(-48:_>I( c"E#(l+ .05u Hs&g1m# #aC5 !![ (-(/q3_47:H;ADE -E/15Q:>y@DhH0p !#K%*-2248<=|(,6.;p< Ca % (0$14C:=Fx" 9%!)/i<#=?@E^ "(%,/r3: 9=@D3 !&a)+..3A8:FACESC5 "%H -039z;= CEiH="(("}|`m$xUOIF B< ::(4 ?3N?J 1@ , A) ? ( < #a (  p :S %2  ]=G$!}|`m$bx43N! "%'&1')d,] +X>>@M)00#a]!'7!p?@BH0+1%*+@oBB"}pl`m$nProcessControlConstructs[Function]Trueifisthehandleofanactiveprocess,i.e.,onethathasnotyetnished.[Function]Trueifisthehandleofadeletedprocess.Thisisanalogousto.Itdiersfrominthatitnevercausesanerror,whilecancauseanerrorifitsargumentisnotaprocessatall.[Function]Unwindstoitstoplevelandreevaluatesitsform.Thisiseectivelyafollowedbytheoriginal.[Function]Mapsoverallprocesses,callingwiththreearguments:theprocesshandle,itsname,anditsform.[Function]Ifisaprocesshandleorthenameofaprocess,returnstheprocesshandleforit,else.Ifis,generatesanerrorifisnot,anddoesnotname,aliveprocess.0.1.2ProcessControlConstructs[Function]Yieldscontroltothenextwaitingprocess,assuminganyisreadytorun.Ifisspecied,itisanumberofmillisecondstowaitbeforereturning(inwhichcaseisverymuchlike),or,meaningwaitforever(untilexplicitlywoken).Alternatively,canbegivenasamillisecondtimer(asreturnedby)ofanabsolutetimeatwhichtowakeup.Inanyofthosecases,theprocessentersthestateuntilthetimelimitisup.withnoargumentsleavestheprocessinthestate,i.e.,itreturnsassoonaseveryotherrunnableprocessofthesamepriorityhashadachance.[Function]Explicitlywakesprocess,i.e.,makesit,andcausesitscallto(orotherwaitingfunction)toreturn.Thisisonesimplewaytonotifyaprocessofsomehappening;however,notethatifisappliedtoaprocessmorethanoncebeforetheprocessactuallygetsitsturntorun,itseesonlythelatest.[Function]Blocksprocessindenitely,i.e.,willnotrununtilitiswokenbya.Thefollowingthreefunctionsallowaccesstothestackcontextofsomeotherprocess.Theyrequirealittlebitofcare,andarecomputationallynon-trivial,buttheydoprovideamorepowerfulwayofmanipulatinganotherprocessthanallows.[Function]Performsinthestackcontextof.0.4(PROCESSP)(RELPROCESSP)RELSTKPPROCESS.FINISHEDPPROCESS.FINISHEDP(RESTART.PROCESS)DEL.PROCESSADD.PROCESS(MAP.PROCESSES)(FIND.PROCESS)NILT(BLOCK)BLOCKDISMISSTSETUPTIMERwaitingBLOCKrunnable(WAKE.PROCESS)runnableBLOCKWAKE.PROCESS(SUSPEND.PROCESS)WAKE.PROCESSWAKE.PROCESS(PROCESS.EVALV)(EVALV)PROCPROCPROCHANDLEPROCHANDLEPROCPROCPROCMAPFNMAPFNPROCERRORFLGPROCERRORFLGPROCMSECSWAITTIMERMSECSWAITTIMERPROCSTATUSPROCSTATUSSTATUSPROCPROCPROCPROCVARVARPROC|b'!k&{+ x\AC5 Z D!$(*>,+0577:n=8?BD^WC5 U.%'k).016<@AH0TJf$6M7:<#?D%FR*r-"0368,>>DFHPv MC5 LT!#%(,/ 6L8b=@TA HJ!h')+_9GC5 Fo y &0 3%6 =@1ED] H"!AXC5 ?($)8+-m1424*9_>@EZ> !"+ -d.W4r6x9?y@CFrBDrH\0R, &')3*U/u1% 8:=xAG.#O$'+45p88>tAiF - #| 03x59d;6< CG+aU'(*,2<5w7&;I=@CEoH&)K!&^*q148#:=ABv(#'*.08@,DF&oS &k+;,/O27:,<> #jC5 ! !)*-+1P78|;!?GAC "(*Z34758;w?BDHyw0! (.14@BGHk# &C*,169d;2>*?BCF-"(C5 (%& ,36f8;?@BFH!  #% 'j*/1'48,=w@EF2   i"^&)+-237m=$?A  !~ C5 '2(+<.3|8(!}t`m$,x\A W =TJ'}R~M J 0d G AX > ,3 ..;70+ag {),xE&{(2x#j p{!2xE&y6 (   < %}t `m$x\ASZ[WUcR:,;M4LTaGF+.AXV?2> #&0);v=30R-,+#jV[!&s( .00-(4!"/16 -| #i$536!}`m$[Function]Evaluatesinthestackcontextof.Ifistrue,blocksuntiltheevaluationreturnsaresult,elseallowsthecurrentprocesstoruninparallelwiththeevaluation.Anyerrorsthatoccurwillbeinthecontextof,sobecareful.Inparticular,notethatandbehavequitedierentlyifcausesanerror.AnditisquitepermissibletointentionallycauseanerrorinprocbyperformingIferrorsarepossibleandistrue,thecallershouldalmostcertainlymakesurethattrapstheerrors;otherwisethecallercouldendupwaitingforeverifunwindsbackintothepre-existingstackcontextof.[Function]Performsinthestackcontextof.Notesamewarningsaswith.0.1.3EventsAn``event''isasynchronizingprimitiveusedtocoordinaterelatedprocesses,typicallyproducersandconsumers.Consumerprocessescan``wait''onevents,andproducers``notify''events.[Function]Returnsaninstanceofthedatatype,tobeusedastheeventargumenttofunctionslistedbelow.isarbitrary,andisusedfordebuggingorstatusinformation.[Function]Suspendsthecurrentprocessuntilisnotied,oruntilatimeoutoccurs.Ifis,thereisnotimeout.Otherwise,timeoutiseitheranumberofmillisecondstowait,or,ifis,amillisecondtimersettoexpireatthedesiredtimeusing(seepageX.XX).[Function]Ifthereareprocesseswaitingfortooccur,causesthoseprocessestobeplacedintherunningstate,withreturnedasthevaluefrom.Ifistrue,onlyrunstherstprocesswaitingfortheevent(thisshouldonlybedoneiftheprogrammerknowsthattherecanonlybeoneprocesscapableofrespondingtotheeventatonce).Themeaningofaneventisuptotheprogrammer.Ingeneral,however,thenoticationofaneventismerelyahintthatsomethingofinteresttothewaitingprocesshashappened;theprocessshouldstillverifythattheconceptualeventactuallyoccurred.Thatis,0.5(PROCESS.EVAL)(PROCESS.EVAL'(NLSETQ(FOO)))(NLSETQ(PROCESS.EVAL'(FOO)))FOO(PROCESS.EVAL'(ERROR!))(PROCESS.APPLY)(APPLY)PROCESS.EVAL(CREATE.EVENT)EVENT(AWAIT.EVENT)NILTSETUPTIMER(NOTIFY.EVENT)AWAIT.EVENTtheprocessshouldbewrittensothatitoperatesPROCFORMWAITFORRESULTFORMPROCWAITFORRESULTPROCPROCPROCPROCWAITFORRESULTFORMFORMPROCPROCFNARGSWAITFORRESULTFNARGSPROCNAMENAMEEVENTTIMEOUTTIMERPEVENTTIMEOUTTIMERPEVENTONCEONLYEVENTEVENTONCEONLYx\AC5 Z!#&).i34v@BXEX #()%--/36 :?e@CjDWO; $'+.w2C468;#@E1FGU % (%OI 5 &+0%2A69;=@ H0G #I%8(*S-v/p A $'1w258;@DH@?hp%|(+a/68_!'Z*-t/297>:?~D;C5 9*,U.227 <1=@D8HS&|3 ix/  j? x#&( /4l :@G(- - J$&+1-4B 9*C5 ).%$&-458 ;r=M?C'eo#',- 36^7;$=qD6F % "C5 !8 $)128Z:=_>CH\!"&(*#0 6<=ABH& !O$&-0/1&2k 9=?AEGGk,.2,AC5 Nu%*137<7?FGm$(-/5*68<~IP r!%(-+E-0c53:<=>BMEe !]# +/268;=x@D^ s" $~(/)  uZ"i +.-2p8r: B@DF+ Z  b/_$E%(g-B24;w=BG?   ^"g(+("}D`m$x\A (R '/8L_ .aI(D ' ; +9)>8Hk * @).)" %j/XG#3 A !|? { -/4b8:^>@CQD!}D`m$px\AVpq"C'Z0*1679?WOACqR#j%L*"+D#j%A&'*0<@?!M" >}A5B;-]!"%V+9#q%'8:q*''" b!8,(wA ,+'P' }8`m$MonitorsInparticular,thecompletionofandrelatedoperationsineectwakesuptheprocessinwhichtheywereperformed,sincethereisnosecurewayofknowingwhethertheeventofinterestoccurredwhiletheprocesswasbusyperformingthe.Thereiscurrentlyoneclassofsystem-denedevents,usedwiththenetworkcode.EachPupandNSsockethasassociatedwithitaneventthatisnotiedwhenapacketarrivesonthesocket;theeventcanbeobtainedbycallingor,respectively.0.1.4MonitorsItisoftenthecasethatcooperatingprocessesperformoperationsonsharedstructures,andsomemechanismisneededtopreventmorethanoneprocessfromalteringthestructureatthesametime.Somelanguageshaveaconstructcalledamonitor,acollectionoffunctionsthataccessacommonstructurewithmutualexclusionprovidedandenforcedbythecompilerviatheuseofmonitorlocks.Interlisp-Dhastakenthisimplementationnotionasthebasisforamutualexclusioncapabilitysuitableforadynamically-scopedenvironment.Amonitorlockisanobjectcreatedbytheuserandassociatedwith(e.g.,storedin)somesharedstructurethatistobeprotectedfromsimultaneousaccess.Toaccessthestructure,aprogramwaitsforthelocktobefree,thentakesownershipofthelock,accessesthestructure,thenreleasesthelock.Thefunctionsandmacrosbelowareused:[Function]Returnsaninstanceofthedatatype,tobeusedasthelockargumenttofunctionslistedbelow.isarbitrary,andisusedfordebuggingorstatusinformation.[Macro]Evaluateswhileowning.Valueisthelastof.Thisconstructisimplementedsothatthelockisreleasedeveniftheformisexitedviaerror(currentlyimplementedwith).Ownershipofalockisdynamicallyscoped:ifthecurrentprocessalreadyownsthelock(e.g.,ifthecallerwasitselfinsideaforthislock),isanoop.[Macro]Like,butimplementedwithoutthe.Userinterrupts(e.g.,^E)areinhibitedduringtheevaluationof.Programmingrestriction:theevaluationofmustnoterror(thelockwouldnotbereleased).Thisconstructismainlyusefulwhenisasmall,safecomputationthatnevererrorsandneedneverbeinterrupted.[Function]Foruseinblockinginsideamonitor.Performs,butreleasesrst,andreobtainsthelock(possiblywaiting)onwakeup.Typicalusefor:Afunctionwantstoperformsomeoperationon,butonlyifitisinacertainstate.Ithastoobtainthelockonthestructuretomakesurethatthestateofthe0.6correctlyevenifwokenupbeforethetimeoutandintheabsenceofthenotiedevent.PROCESS.EVALPROCESS.EVAL(PUPSOCKETEVENT)(NSOCKETEVENT)(CREATE.MONITORLOCK)MONITORLOCK(WITH.MONITOR.)(PROGN.)RESETLSTWITH.MONITORWITH.MONITOR(WITH.FAST.MONITOR.)WITH.MONITORRESETLST(MONITOR.AWAIT.EVENT)(AWAIT.EVENT)MONITOR.AWAIT.EVENTPUPSOCKETNSOCKETNAMENAMELOCKFORMSFORMSLOCKFORMSLOCKFORMSFORMSFORMSFORMSRELEASELOCKEVENTTIMEOUTTIMERPEVENTTIMEOUTTIMERPRELEASELOCKFoo|b'&x\:>@ GZ  W $ +:,0469=?|CFX 2v3 #%k+&0368=CGWI d (FTD Gf!&+.249>ADGqR a  r#*$)t-.&2j68:?AEyGP ,@DA |L ixH/  9 z| $) 0826L <?JBF  K6$',/446m8A P "b#(s. 4:B%DuF9   R" %[*, 36&;.=A C7  OX3C5 1|#%0168O:=+>@C0Keo#',- 36^7;$=qD6F . +D)++.7S8JDHs&!y ' 0!9;BDFEvHs%  F$K%(,16W9<1?#BwCF,#dO!-h/2B@B C5 ^D%%( 06?=@0C %*', 3!9 < '') 0"6:D 1#Z$N%+</059?C|DPF !  h `)n 5$[&),.4V69=?BaEG(!}<`m${\: dj %(*U,13x5:xZ WI1 P*- ?m3 J1'g +  )#)&3@#d" 6 ^ *$A 8 53 qb d}<0`m$~xP#c930K'+n)%u&434DE ^  4512h;;!%[*a0>Cq%<+} ABIB} l`m$jstructuredoesnotchangebetweenthetimeitteststhestateandperformstheoperation.Ifthestateturnsouttobebad,itthenwaitsforsomeotherprocesstomakethestategood,meanwhilereleasingthelocksothattheotherprocesscanalterthestructure.Itissometimesconvenientforaprocesstohaveatitstoplevelandthendoallitsinterestingwaitingusing.Notonlyisthisoftencleaner,butinthepresentimplementationincaseswherethelockisfrequentlyaccessed,itsavestheoverheadof.Programmingrestriction:theremustnotbeanbetweentheenclosingandthecalltosuchthatthewouldcatchanandcontinueinsidethemonitor,forthelockwouldnothavebeenreobtained.(Thereasonforthisrestrictionisthat,althoughwon'titselferror,theusercouldhavecausedanerrorwithaninterrupt,orainthecontextofthewaitingprocessthatproducedanerror.)Onrareoccasionsitmaybeusefultomanipulatemonitorlocksdirectly.Thefollowingtwofunctionsareusedintheimplementationof:[Function]Takespossessionof,waitingifnecessaryuntilitisfree,unlessistrue,inwhichcaseitreturnsimmediately.Ifistrue,performsatobeunwoundwhentheenclosingexits.Returnsifwassuccessfullyobtained,ifthecurrentprocessalreadyowned.[Function]Releasesifitisownedbythecurrentprocess,andwakesupthenextprocess,ifany,waitingtoobtainthelock.Whenaprocessisdeleted,anylocksitownsarereleased.0.1.5GlobalResourcesThebiggestsourceofproblemsinthemulti-processingenvironmentisthematterofglobalresources.Twoprocessescannotbothusethesameglobalresourceiftherecanbeaprocessswitchinthemiddleoftheiruse(currentlythismeanscallsto,butultimatelywithapreemptiveschedulermeansanytime).Thus,usercodeshouldbewaryofitsownuseofglobalvariables,ifitevermakessenseforthecodetoberuninmorethanoneprocessatatime.``State''variablesprivatetoaprocessshouldgenerallybeboundinthatprocess;structuresthataresharedamongprocesses(orresourcesusedprivatelybutexpensivetoduplicateperprocess)shouldbeprotectedwithmonitorlocksorsomeotherformofsynchronization.Asidefromusercode,however,therearemanyglobalvariablesandresources.Mostofthesearisehistoricallyfromthesingle-processInterlisp-10environment,andwilleventuallybechangedinInterlisp-Dtobehaveappropriatelyinamulti-processingenvironment.Somehavealreadybeenchanged,andaredescribedbelow.Twootherresourcesnotgenerallythoughtofasglobalvariablesthekeyboardandthemouseareparticularlyidosyncratic,andarediscussedinthenextsection.0.7(WITH.MONITOR(untildo(MONITOR.AWAIT.EVENT)))WITH.MONITORMONITOR.AWAIT.EVENTRESETLSTWITH.MONITORERRORSETWITH.MONITORMONITOR.AWAIT.EVENTERRORSETERROR!MONITOR.AWAIT.EVENTPROCESS.EVALWITH.MONITOR(OBTAIN.MONITORLOCK)NILRESETSAVERESETLSTT(RELEASE.MONITORLOCK)BLOCKsystemFooLockcondition-of-FooFooLockEventFooChangedtimeoutoperate-on-FooLOCKDONTWAITUNWINDSAVELOCKDONTWAITUNWINDSAVELOCKLOCKLOCKLOCKLOCKx\: !T$h%(*.068 ?x@C8FWZ  _  `: $g)6*.04"7>DFX  zsC!L M    |#%357:)=@sCEHLM )*-{02L58>@BE J  #%} ,\2{47AH&IE  7 #1%2.36jG(DW  k!$'159AeD<B |x"%), 48 <>A HsA  #\',*._037:?`AWDG?e 6!&c(*x/G46<><`  A YS;I ( -?06#8>AG:  %/ &7C5 6 "''?(,.54<7z8:,=HHs4jr m#J$,+ 4z>c?BH2!t#j)-C/<@1 &.[/26;@{HN.C5 ,s "1#m$)*-9169=?}AD* "x&)' )c) !%}'|#d ix  "a% , 46|8=t?MC Y  $u#k'-.2 467<ABE:  F i7"(), 3M67 ?IE R7=!$}&C(++;-/3 9;@<?CGh  i^+!&()-28=_?,@vEe hW %}(3*n.3&9;-AD2  8"'))1/Y27;q=L@DH&w q  b #$+$/847 >A~C*F Y6 $V&" .m1 3 :;A=B H; &  z  &b /93$6;i>DG ?!/#)r.0715 <>DG o  #M%+-O/2("}`m$xU TD qR H4PtM) LMJ:xI E'2<~ DW*B;A ?e : 7 .w4j)1251-. ${q&}`m$dxU]TDS r}R!r"!"&()1*S*0PA7x#&v,6#$AaE4j5C?H\P  uo&!%R()-38;=IOR 6i (W-)/q179<AGM  \ '),Y149";2@WAFHL  `AK/I +h 1z3W6r9;T=BDFG\ !u(,v037E  !$'+).4169m<>\CG(D ZI0%'(4+. 0;14E9WA  3"'1R8ACE?e { &n* 038X:&=?YA~G= a&bD"'*H0,14\94=? DG Hs<  ^Hc% W!%(+H0o24y7;c<=B9  t|F '&)/L246;@5BFW7o v@e  %\),v249=?iE7G5 4hC' .15;=?DG4#  [ k !#$<&)E,.35f7: BFG2~ Sl!'9)468;=>AC0 |"$:),0|26AqF G/2 G!$"%*,/ 79<AC - 3!#B&,09.:H|)( iMx$ m.%(*8 1 9T;&>C # Wt O&x) 79=t@F6!x J"4%+/37V9#<}?EH q 6$@).x179A  $*! (O) 172;DEHs' pW K#%* 2C5=9m<?"EH0  d}<"'$'(.)489S=@AG  >F]%P'i)+-1C7\;@CU6  Qu"3$ +;.J05Z7a<@{AC(G  4 , #&(*y,1Y25M8o:'< C   U!#%3*#  N %  r$*0 7/8;?AQ ?  t4"}(3)/15 ( } `m$6xZ#+GXPBHGSOR JL"}ICG\;A )299T5 M2~+08s B/23-10;#1>6I{>e@"} `m$`0.1.6.1SwitchingtheTTYProcessAnyprocesscanmakeitselfbethettyprocessbycalling.[Function]Returnsthehandleofthecurrentttyprocess.Inaddition,ifisnon-,makesitbethettyprocess.Thespecialcaseof=isinterpretedtomeantheexecutiveprocess;thisissometimesusefulwhenaprocesswantstoexplicitlygiveupbeingthettyprocess.[Function]Trueifisthettyprocess;defaultstotherunningprocess.Thus,istrueifthecalleristhettyprocess.[Function]Ecientlywaitsuntilistrue.iscalledinternallybythesystemfunctionsthatreadfromtheterminal;usercodethusneedonlycallitinspecialcases.Insomecases,suchasinfunctionsinvokedasaresultofmouseactionorauser'styped-incall,itisreasonableforthefunctiontoinvokeitselfsothatitcantakesubsequentusertypein.Inothercases,however,thisistooundisciplined;itisdesirabletolettheuserdesignatewhichprocesstypeinshouldbedirectedto.Thisismostconvenientlydonebymouseaction.Thesystemsupportsthemodelthat``totypetoaprocess,youclickinitswindow.''Tocooperatewiththismodel,anyprocessdesiringkeyboardinputshouldputitsprocesshandleasthepropertyofitswindow(s).Tohandlethecommoncase,thefunctiondoesthisautomaticallywhenthettydisplaystreamisswitchedtoanewwindow.Aprocesscanownanynumberofwindows;clickinginanyofthosewindowsgivestheprocessthetty.Thismechanismsucesformostcasualprocesswriters.Forexample,ifaprocesswantsallitsinput/outputinteractiontooccurinaparticularwindowthatithascreated,itshouldjustmakethatwindowbeitsttywindowbycalling.Thereafter,itcanorto/fromthestream;iftheprocessisnotthettyprocessatthetimethatitcalls,itwillblockuntiltheuserclicksinthewindow.Forthoseneedingtightercontroloverthetty,thedefaultbehaviorcanbeoverriddenorsupplemented.Theremainderofthissectiondescribesthemechanismsinvolved.Thereisawindowpropertythatcontrolswhetherandhowtoswitchthettytotheprocessowningawindow.Themousehandler,beforeinvokinganynormal,specicallynoticesthecaseofabuttongoingdowninawindowthatbelongstoaprocess(i.e.,hasawindowproperty)thatisnotthettyprocess.Inthiscase,itinvokesthewindow'sofoneargument().defaultsto:[Function]Ifhasaproperty,performsandtheninvokes's(oriftherightbuttonisdown).Therearesomecaseswhereclickinginawindowdoesnotalwaysimplythattheuserwantstotalktothatwindow.Forexample,clickinginatexteditorwindowwithashiftkeyhelddownmeansto0.9TTY.PROCESS(TTY.PROCESS)NILT(TTY.PROCESSP)(TTY.PROCESSP)(WAIT.FOR.TTY)(TTY.PROCESSP)WAIT.FOR.TTYTTY.PROCESSPROCESSTTYDISPLAYSTREAMTTYDISPLAYSTREAMPRINTREADTREADWINDOWENTRYFNBUTTONEVENTFNPROCESSWINDOWENTRYFNWINDOWENTRYFNGIVE.TTY.PROCESS(GIVE.TTY.PROCESS)PROCESS(TTY.PROCESS(WINDOWPROP'PROCESS))BUTTONEVENTFNRIGHTBUTTONFNPROCPROCPROCPROCPROCPROCWINDOWWINDOWWINDOWWINDOWWINDOW|\: ipxW  EO>!&{(u6TC5 S*i$%(L-+/U46<B9CIQ0 !}#(+0/38;=h DtF!O "%~(+)0b48C9y>VBAC N9 i"$K4C5 I1 "z% 'K06S81:@$F G#%X(9)+/13o5DC5 C="f24DEA  *"'d-037p:@:CdF? !#(<  v[ r%'(,.37H9*:r>cB+CFHs;G +:.03`47i:t ADG9  vR=g (*L+13a5k7:@E7 ! # +/S1M54  SW r"%'(. 04(57>K@}F3Q  $#',.0j5?9;yDG1   _ yS"&'(v;>Ar 0  -i!#l$'-/L4569<AC._ HF!$(+?+Z  w!&Y+Q-345:h> ?A ) ~G %()s,1B27G:=@EH(  $% ,-5*:?CH}&i  V2( /"%(*0w1_25w9@<>AEG$ !  C~!$'&)-3c57 >@   S B"$$ ,1 '\*E/47:<A CEGm cs!&Z*02B/B  *9b#%&,1/!4K67i<\?B+" 7j %'*}-//446H&|  %{*9wC5  !)K/J19+&),->6=Bc # $ U4!s#N$)-T/48;>ABENG)  "$%(,2&5c69<?CH0(}`m$xW, T ?S*F|Q:K4 G D C=& 9 ;G!c 3Q=1-(`0z6BJ&i- m7C Cw"< | ,Pw e"5/ @ + 7p D }@`m$pxTS*>4?Q46zK4VIi,.|2`w :5c+05!} 8`m$HHandlingofInterrupts``shift-select''somepieceoftextintotheinputbuerofthettyprocess.Theeditorsupportsthisbysupplyingathatperformsifnoshiftkeyisdown,butgoesintoitsshift-selectmode,withoutchangingthettyprocess,ifashiftkeyisdown.Theshift-selectmodeperformsaoftheselectedtextwhentheshiftkeyisletup,thefeedinginputtothecurrentttyprocess.Sometimesaprocesswantstobenotiedwhenitbecomesthettyprocess,orstopsbeingthettyprocess.Forexample,Chat(pageX.XX)turnsoallkeyboardinterruptcharacterswhileitisthettyprocess,sothattheycanbepassedtransparentlytotheremotehost.Tosupportthis,therearetwoprocessproperties,and.Theactionstakenbywhenitswitchesthettytoanewprocessareasfollows:theformerttyprocess'siscalledwithtwoarguments();thenewprocessismadethettyprocess;nally,thenewttyprocess'siscalledwithtwoarguments().Normallytheandneedonlytheirrstargument,buttheotherprocessinvolvedintheswitchissuppliedforcompleteness.Inthepresentsystem,mostprocesseswanttointerpretthekeyboardinthesameway,soitisconsideredtheresponsibilityofanyprocessthatchangesthekeyboardinterpretationtorestoreittothenormalstatebyits.Awindowis``owned''bythelastprocessthatanyonegaveasthewindow'sproperty.Ordinarilythereisnoconicthere,asprocessestendtoowndisjointsetsofwindows(though,ofcourse,cooperatingprocessescancertainlytrytoconfuseeachother).Theonlylikelyproblemariseswiththatmostglobalofwindows,.Programsshouldnotbetemptedtoreadfrom.Thisisnotusuallynecessaryanyway,astherstattempttoreadfrominaprocessthathasnotsetitstoitsownwindowcausesattywindowtobecreatedfortheprocess(seepageX.XX).0.1.6.2HandlingofInterruptsAtthetimethatakeyboardinterruptcharacterisstruck,anyprocesscouldberunning,andsomedecisionmustbemadeastowhichprocesstoactuallyinterrupt.Totheextentthatkeyboardinterruptsarerelatedtotypein,mostinterruptsaretakeninthettyprocess;however,thefollowingarehandledspecially:,(normally^Dand^E)Theseinterruptsaretakeninthemouseprocess,ifthemouseisnotinitsidlestate;otherwisetheyaretakeninthettyprocess.Thus,^Ecanbeusedtoabortsomemouse-invokedwindowaction,suchastheShapecommand.Asaconsequence,notethatifthemouseinvokessomelengthycomputationthattheuserthinksofas``background'',^Estillabortsit,eventhoughthatmaynothavebeenwhattheuserintended.Suchlengthycomputations,forvariousreasons,shouldgenerallybeperformedbyspawningaseparateprocesstoperformthem.Theinterruptinaprocessotherthantheexecutiveisinterpretedexactlyasifanerrorunwoundtheprocesstoitstoplevel:iftheprocesswasdesignated=,itisrestarted;otherwiseitiskilled.(Initially^H)Amenuofprocessesispresentedtotheuser,whoisaskedtoselectwhichonetheinterruptshouldoccurin.Thecurrentttyprocessappearswitha*nexttoitsnameatthetopofthemenu.Themenualsoincludesanentry``[SpawnMouse]'',forthecommoncaseofneedingamousebecausethemouseprocessiscurrentlytieduprunningsomeone's;selectingthisentryspawnsanewmouseprocess,andno0.10currentWINDOWENTRYFNGIVE.TTY.PROCESSBKSYSBUFBKSYSBUFTTYEXITFNTTYENTRYFNTTY.PROCESSTTYEXITFNTTYENTRYFNTTYENTRYFNTTYEXITFNTTYEXITFNPROCESSPROMPTWINDOWPROMPTWINDOWTTTYDISPLAYSTREAMRESETERRORRESETRESTARTABLETHELPBUTTONEVENTFNOLDTTYPROCESSNEWTTYPROCESSNEWTTYPROCESSOLDTTYPROCESS|b'"(* x\:  = "&*,`3l5~:=AG>Z  6!568<>@DBFX  x$&).@/0368<^?:BGF WI 9Y!$B'*\-z0135?DH0U  IR O;#=&(<-0'247X9<@QBDP  , "D$&,2 9(<>t@BDOR   #%(]-01;38;?B4EM  $G%A(5,0<@BGL   i, #')79:=E@tC5Ja "W$(- .25V7=BBDGH Xo!$y+EACG  $.'p*-4}7'9=vBqH0Ep  yx3 $&(-26"CF5= |0 i_ x,s  + &f',.3b78>lAD*  B#o   h%l +-04#6< C EO)(  & !#%+51 3h9u;A &#$}e[@"&1 ,/)347<AjBE"e}i"X(+.h2T4068>BE6G!1e O$* /j479c;@MGe % Y#B$'9+04q9s ADlFe^$m&)H-y/;27P:-=??CF@en"' 0378=dAGe""*#S(-v/"4ue "y#(},/H179& @8DFGe[$0%'*9./f169L JeP %'N(De _!A"(*j02[48;<@_BEe'y# &)[,I1(3Q89=Y@ACF>H ed!f%(,d/%4{6`9?iENG Se"#(6-K/38:?BD e$&+.2-78F;M?EG(o"} `m${\:.xZe 'WI8VM 2 L/H G t jB$)?6:.( ; 836 &# @@ JHD   "} `m$\xJa eH+27A=} 4`m$ breakoccurs.(Initially^B)Performstheinterruptalwaysinthettyprocess.(Initially)Thisinterruptclearstypeaheadinprocesses.,,Theseinterruptsalwaysoccurinwhateverprocesswasrunningatthetimetheinterruptstruck.Inthecasesofand,thismeansthattheinterruptismorelikelytostrikeintheoendingprocess(especiallyifitisa``runaway''processthatisnotblocking).Note,however,thatthisprocessisstillnotnecessarilytheguiltyparty;itcouldbeaninnocentbystanderthatjusthappenedtouseupthelastofaresourceprodigiouslyconsumedbysomeotherprocess.0.1.7KeepingtheMouseAliveSincethewindowmousehandlerrunsinitsownprocess,itisnotavailablewhileawindow'sfunction(oranyoftheotherwindowfunctionsinvokedbymouseaction)isrunning.Thisleadstotwosortsofproblems:(1)alongcomputationunderneathadeprivestheuserofthemouseforotherpurposes,and(2)codethatrunsasacannotrelyonothersrunning,whichmeansthattheresomepiecesofcodethatrundierentlyfromnormalwhenrununderthemouseprocess.Theseproblemsareaddressedbythefollowingfunctions:[Function]Spawnsanothermouseprocess,allowingthemousetorunevenifitiscurrently``tiedup''underthecurrentmouseprocess.ThisfunctionisintendedmainlytobetypedinattheLispexecutivewhentheusernoticesthemouseisbusy.[Function]Performsaonlywhencalledunderneaththemouseprocess.Thisshouldbecalled(once,onentry)byanyfunctionthatreliesonsforcompletion,ifthereisanypossibilitythatthefunctionwillitselfbeinvokedbyamousefunction.Itneverhurts,atleastlogically,tocallorneedlessly,asthemouseprocessarrangestoquietlykillitselfifitreturnsfromtheuser'sandndsthatanothermouseprocesshassprungupinthemeantime.(Thereis,ofcourse,somecomputationalexpense.)0.1.8DebuggingProcesses[Function]Putsupawindowthatprovidesseveraldebuggingcommandsformanipulatingrunningprocesses.Ifthewindowisalreadyup,refreshesit.Ifisaposition,thewindowisplacedinthatposition;otherwise,theuserispromptedforaposition.Thewindowconsistsoftwomenus.Therstisamenuofalltheprocessesatthemoment.Commandsinthesecondmenuoperateontheprocessselectedinthe0.11BREAKHELPRUBOUTallRAIDSTACKOVERFLOWSTORAGEFULLSTACKOVERFLOWSTORAGEFULLBUTTONEVENTFNBUTTONEVENTFNBUTTONEVENTFNBUTTONEVENTFN(SPAWN.MOUSE)(ALLOW.BUTTON.EVENTS)(SPAWN.MOUSE)BUTTONEVENTFNSPAWN.MOUSEALLOW.BUTTON.EVENTSBUTTONEVENTFN(PROCESS.STATUS.WINDOW)PROCESS.STATUS.WINDOW_WHEREWHEREx\8e7Y3e !m'-m13z57V-e # :%)0W3 S( HQeq "2%'-2y50:p<>ADOe( //<-=<@DGN7e4H"#')M+16 =x>@GAB LeB %)/2n59;q>@ GJeCM k"[$J)0125;=@B D~FHIFe '0)*,0V|D ix@|  e& $&4(x+13T5*8>)BFC>b!#',279>PBDT=1  o "/#Q&a .L 5BG;  1e! #%)+.0=ADDFA9LF#v&1)-&1+268;D AE%8@  10 5$3*6,247/=; 3C5 25!&;+{1 379?+C5 *?b),0-3 ;=PAF(!%'+-0F58h;H& !D"&'n* 0o3.5:=@BG%N%"H  zYU? ,]> EG C6!7$%'I+/]1ACG ) "*$o+E/1R27: C| i;x3C5 t#&,y138? A  $d&)(.5/4B o'):*03L8:t?AD' " #v$+1-m. |$&V)-03{469;=?EG %3&)l.279 ;@|EG(o }`m$rxY3 #V- {2xS( $.!{O"'28> =16 ;1 9 3 + *?e (= "H" .7 5 3 !7"}`m$^x33?B"; } `m$Non-ProcessCompatibilityrstmenu.Thecommandsare:,,,Performsabacktraceoftheselectedprocess.Thersttime,itpromptsforawindowinwhichtodisplaythebacktrace.Changestheselectiontothettyprocess,i.e.,theonecurrentlyincontrolofthekeyboard.Associatesthekeyboardwiththeselectedprocess;i.e.,makestheselectedprocessbethettyprocess.Iftheselectedprocesshasan,callsit.Thehookmaybeafunction,whichisthenappliedtotwoarguments,theprocessandthebutton(or)usedtoinvoke,oraform,whichissimply'ed.Theorhappensinthecontextoftheselectedprocess,usingor.Theinfohookcanbesetusing.Deletestheselectedprocess.Restartstheselectedprocess.Wakestheselectedprocess.Promptsforavaluetowakeitwith(see).Suspendstheselectedprocess;i.e.,causesittoblockindenitely(untilexplicitlywoken).Enterabreakundertheselectedprocess.Thishasthesideeectofwakingtheprocesswiththevaluereturnedfromthebreak.Currently,theprocessstatuswindowrunsunderthemouseprocess,likeothermenus,soifthemouseisunavailable(e.g.,amousefunctionisperforminganextensivecomputation),youmaybeunabletousetheprocessstatuswindow(youcantry,ofcourse).0.1.9Non-ProcessCompatibilityThissectiondescribessomeconsiderationsforauthorsofprogramsthatranintheoldsingle-processInterlisp-Denvironment,andnowwanttomakesuretheyrunproperlyintheMulti-processingworld.Thebiggestproblemtowatchoutforiscodethatrunsunderneaththemousehandler.Writersofmousehandlerfunctionsshouldrememberthatintheprocessworldthemousehandlerrunsinitsownprocess,andhence(a)youcannotdependonndinginformationonthestack(stashitinthewindowinstead),and(b)whileyourfunctionisrunning,themouseisnotavailable(ifyouhaveanynon-trivialcomputationtodo,spawnaprocesstodoit,notifyoneofyourexistingprocessestodoit,orusetorunitundersomeotherprocess).Thefollowingfunctionsaremeaningfuleveniftheprocessworldisnoton:(invokesthesystembackgroundroutine,whichincludeshandlingthemouse);,(bothreturn0.12BTBTVBTV*BTV!WHO?KBD_INFOINFOHOOKLEFTMIDDLEINFOEVALAPPLYEVALPROCESS.APPLYPROCESS.EVALPROCESSPROPKILLRESTARTWAKEWAKE.PROCESSSUSPENDBREAKSPAWN.MOUSEPROCESS.EVALBLOCKTTY.PROCESSTHIS.PROCESS|b'!$) x\8f!(|Y3T W"n#)+H-28:=@BCGU"$(*K.1V R"0$*I,.p058k:=CtE/Q<O N7 #"%+.1 65;>BTDL!g#V%'I= & +-6f7g:<?CzFHG"&(+025 <?DGFA!D%,.$13;<>@D)HsD$(#0-6L;=@{EGB!'[6BCFAO "$&3>J!}#)9!$3)Z6!<#)2//47P8<>wB4CG4&0I"%b*0H37y8:> F . "z+ F!V%(+:0I58:=0?CE%)#&)9,2u587& ~ #'*.s36E9>@^ADHs%N <D!A ({*y0t 9K<?AEGj#  I@+-,-|C i_o x  3 $'W,m.T47:0< >A1E9 U Tk"$(f+s.1A68;> E  Zzi! "r%(v+ 259n>CE \"$_&+/m16; >6?ADG  in n? -$ ,3."0j378:b<AG(  8BB"N&(/*0x2a5%8y;(=A    (Pz!w$%) .4 579e;&H0V   d Q  5 "s%'%).`2P36<=CEf p%(6BE(o }8`m$TxY30!RN7I/FA!'8>D!B+72.B+5 8 AO*K >J;E64 1+#! = Q8 -N 7h !}8`m$`);and(returns,i.e.,anyoneisallowedtotakettyinput).Inaddition,thefollowingtwofunctionsexistinbothworlds:[Function]Sameas,whenprocessesarerunning,whennot.Thisishighlyrecommendedformousefunctionsthatperformanynon-trivialactivity.[Function]Sameas,whenprocessesarerunning,whennot.Mostoftheprocessfunctionsthatdonottakeaprocessargumentcanbecalledevenifprocessesaren'trunning.creates,butdoesnotrun,anewprocess(itrunswheniscalled).0.13NILTTY.PROCESSPT(EVAL.AS.PROCESS)(ADD.PROCESS'RESTARTABLE'NO)EVAL(EVAL.IN.TTY.PROCESS)(PROCESS.EVAL(TTY.PROCESS))EVALADD.PROCESSPROCESSWORLDFORMFORMFORMWAITFORRESULTFORMWAITFORRESULTx\: q  !$"(*"/035:%;ACZ  hWC5 U;=A#GTD!C% (D+r,1? :D<AGR"W&JOC5 MDF+LM)Z- IH  v2he6!?#&',25j7^;W>@FG #9!%E'+,h/469HsE (o }`m$x\: u W U -N 8:TDLO *aM ) D LM%zG1 = }`m$ J T `` iPqtuj/xvmHb proc.PRESSVANMELLEAUGUST 19, 1983 14:47:14