/* Ċ Ġ* ĠP _ Add Write Reactor . kt Ċ Ġ* ĠCopyright ĠÂ© Ġ 1 9 9 3 - 2 0 2 1 , ĠThe ĠAv ail ĠFoundation , ĠLLC . Ċ Ġ* ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ Ġ* Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ġmet : Ċ Ġ* Ċ Ġ* Ġ* ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ġnotice , Ġthis Ċ Ġ* ĠĠ Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ Ġ* Ċ Ġ* Ġ* ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ġcopyright Ġnotice , Ċ Ġ* ĠĠ Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe Ġdocumentation Ċ Ġ* ĠĠ Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . Ċ Ġ* Ċ Ġ* Ġ* ĠNeither Ġthe Ġname Ġof Ġthe Ġcopyright Ġholder Ġnor Ġthe Ġnames Ġof Ġthe Ġcontributors Ċ Ġ* ĠĠ Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ġderived Ġfrom Ġthis Ġsoftware Ċ Ġ* ĠĠ Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ġ" AS ĠIS " Ċ Ġ* ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE Ċ Ġ* ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE Ċ Ġ* ĠARE ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT ĠHOLDER ĠOR ĠCONTRIBUTORS ĠBE Ċ Ġ* ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , ĠSPECIAL , ĠEXEMPLARY , ĠOR Ċ Ġ* ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF Ċ Ġ* ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS Ċ Ġ* ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN Ċ Ġ* ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) Ċ Ġ* ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE ĠOF ĠTHIS ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE Ċ Ġ* ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ Ċ package Ġcom . avail . interpreter . primitive . variables Ċ Ċ import Ġcom . avail . descriptor . atoms . A _ Atom . Companion . is Atom Special Ċ import Ġcom . avail . descriptor . atoms . Atom Descriptor Ċ import Ġcom . avail . descriptor . representation . Nil Descriptor . Companion . nil Ċ import Ġcom . avail . descriptor . sets . Set Descriptor . Companion . set Ċ import Ġcom . avail . descriptor . tuples . Object Tuple Descriptor . Companion . tuple Ċ import Ġcom . avail . descriptor . tuples . Tuple Descriptor . Companion . empty Tuple Ċ import Ġcom . avail . descriptor . types . A _ Type Ċ import Ġcom . avail . descriptor . types . A _ Type . Companion . instance Ċ import Ġcom . avail . descriptor . types . Abstract Enumeration TypeDescriptor . Companion . enumeration With Ċ import Ġcom . avail . descriptor . types . FunctionType Descriptor . Companion . function Type Ċ import Ġcom . avail . descriptor . types . TypeDescriptor . Types . ATOM Ċ import Ġcom . avail . descriptor . types . TypeDescriptor . Types . TOP Ċ import Ġcom . avail . descriptor . types . Variable TypeDescriptor . Companion . most General Variable Type Ċ import Ġcom . avail . descriptor . variables . Variable Descriptor Ċ import Ġcom . avail . descriptor . variables . Variable Descriptor . Variable Access Reactor Ċ import Ġcom . avail . exceptions . Avail ErrorCode . E _ SPECIAL _ ATOM Ċ import Ġcom . avail . interpreter . Primitive Ċ import Ġcom . avail . interpreter . Primitive . Flag . Has Side Effect Ċ import Ġcom . avail . interpreter . execution . Interpreter Ċ Ċ /** Ċ Ġ* Ġ** Primitive :** ĠAdd Ġa Ġ[ write &# 3 2 ; reactor ][ Variable Access Reactor ] Ġto Ġthe Ċ Ġ* Ġspecified Ġ[ variable ][ Variable Descriptor ]. ĠThe Ġsupplied Ġ[ key ][ Atom Descriptor ] Ċ Ġ* Ġmay Ġbe Ġused Ġsubsequent ly Ġto Ġremove Ġthe Ġwrite Ġreactor . Ċ Ġ* Ċ Ġ* Ġ@ author ĠT odd ĠL ĠSmith Ġ& lt ; tod d @ avail lang . org & gt ; Ċ Ġ*/ Ċ @ Suppress (" unused ") Ċ object ĠP _ Add Write Reactor Ġ: ĠPrimitive ( 3 , ĠHas Side Effect ) Ċ { Ċ ĉ override Ġfun Ġattempt ( interpreter : ĠInterpreter ): ĠResult Ċ ĉ { Ċĉ ĉ interpreter . check Argument Count ( 3 ) Ċĉ ĉ val Ġvariable Ġ= Ġinterpreter . argument ( 0 ) Ċĉ ĉ val Ġkey Ġ= Ġinterpreter . argument ( 1 ) Ċĉ ĉ val Ġreactor Function Ġ= Ġinterpreter . argument ( 2 ) Ċĉ ĉ // ĠFor bid Ġspecial Ġatoms . Ċĉ ĉ if Ġ( key . is Atom Special ) Ċĉ ĉ { Ċĉĉ ĉ return Ġinterpreter . primitive Failure ( E _ SPECIAL _ ATOM ) Ċĉ ĉ } Ċĉ ĉ val Ġshared Function Ġ= Ġreactor Function . make Shared () Ċĉ ĉ val Ġwrite Reactor Ġ= ĠVariable Access Reactor ( shared Function ) Ċĉ ĉ variable . add Write Reactor ( key , Ġwrite Reactor ) Ċĉ ĉ return Ġinterpreter . primitive Success ( nil ) Ċ ĉ } ĊĊ ĉ override Ġfun Ġprivate BlockType Restriction (): ĠA _ Type Ġ= Ċĉ ĉ function Type ( Ċĉĉ ĉ tuple ( Ċĉĉĉ ĉ most General Variable Type (), Ċĉĉĉ ĉ ATOM . o , Ċĉĉĉ ĉ function Type ( Ċĉĉĉĉ ĉ empty Tuple , Ċĉĉĉĉ ĉ TOP . o )), Ċĉĉ ĉ TOP . o ) ĊĊ ĉ override Ġfun Ġprivate Failure Variable Type (): ĠA _ Type Ġ= Ċĉ ĉ enumeration With ( set ( E _ SPECIAL _ ATOM )) ĊĊ ĉ override Ġfun Ġfal lib ility For Argument Types ( Ċĉ ĉ argument Types : ĠList < A _ Type >): ĠF al lib ility Ċ ĉ { Ċĉ ĉ // ĉ ĉ final ĠA _ Type Ġvar Type Ġ= Ġargument Types . get ( 0 ); Ċĉ ĉ val Ġkey Type Ġ= Ġargument Types [ 1 ] Ċĉ ĉ // ĉ ĉ final ĠA _ Type Ġfunction Type Ġ= Ġargument Types . get ( 2 ); Ċĉ ĉ if Ġ( key Type . is Enumeration ) Ċĉ ĉ { Ċĉĉ ĉ val Ġall Special Ġ= Ġkey Type . instance . all Ġ{ Ġit . is Atom Special Ġ} Ċĉĉ ĉ val Ġnone Special Ġ= Ġkey Type . instance . none Ġ{ Ġit . is Atom Special Ġ} Ċĉĉ ĉ // ĠThe Ġaggregate Ġb ooleans Ġcan Ġonly Ġboth Ġbe Ġtrue Ġin Ġthe Ġde generate Ċĉĉ ĉ // Ġcase Ġthat Ġkey Type Ġis ĠâĬ ¥ , Ġwhich Ġshould Ġbe Ġimpossible . Ċĉĉ ĉ when Ġ{ Ċĉĉĉ ĉ all Special Ġ-> Ġreturn ĠF al lib ility . Call Site Must Fail Ċĉĉĉ ĉ none Special Ġ-> Ġreturn ĠF al lib ility . Call Site Cannot Fail Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return ĠF al lib ility . Call Site Can Fail Ċ ĉ } Ċ } Ċ