/* Ċ Ġ* ĠMacro Definition Descriptor . kt Ċ Ġ* ĠCopyright ĠÂ© Ġ 1 9 9 3 - 2 0 2 0 , Ġ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 . descriptor . methods Ċ Ċ import Ġcom . avail . annotations . Hide Field Just For Print ing Ċ import Ġcom . avail . descriptor . atoms . A _ Atom . Companion . atom Name Ċ import Ġcom . avail . descriptor . atoms . Atom Descriptor . Special Atom Ċ import Ġcom . avail . descriptor . bundles . A _ Bundle Ċ import Ġcom . avail . descriptor . bundles . A _ Bundle . Companion . message Ċ import Ġcom . avail . descriptor . functions . A _ Function Ċ import Ġcom . avail . descriptor . functions . Function Descriptor Ċ import Ġcom . avail . descriptor . methods . Definition Descriptor . Companion . built In No ModuleName Ċ import Ġcom . avail . descriptor . methods . Macro Descriptor . Object Slots . BODY _ BLOCK Ċ import Ġcom . avail . descriptor . methods . Macro Descriptor . Object Slots . B UNDLE Ċ import Ġcom . avail . descriptor . methods . Macro Descriptor . Object Slots . MACRO _ PREFIX _ FUNCTION S Ċ import Ġcom . avail . descriptor . methods . Macro Descriptor . Object Slots . MODULE Ċ import Ġcom . avail . descriptor . module . A _ Module Ċ import Ġcom . avail . descriptor . module . Module Descriptor Ċ import Ġcom . avail . descriptor . numbers . A _ Number . Companion . extract Int Ċ import Ġcom . avail . descriptor . ph rases . List Phrase Descriptor Ċ import Ġcom . avail . descriptor . ph rases . Phrase Descriptor Ċ import Ġcom . avail . descriptor . representation . A _ Basic Object Ċ import Ġcom . avail . descriptor . representation . Avail Object Ċ import Ġcom . avail . descriptor . representation . Descriptor Ċ import Ġcom . avail . descriptor . representation . Mut ability Ċ import Ġcom . avail . descriptor . representation . Object Slots Enum Ċ import Ġcom . avail . descriptor . tuples . A _ String Ċ import Ġcom . avail . descriptor . tuples . A _ Tuple Ċ import Ġcom . avail . descriptor . types . A _ Type Ċ import Ġcom . avail . descriptor . types . A _ Type . Companion . args Tuple Type Ċ import Ġcom . avail . descriptor . types . A _ Type . Companion . lower Bound Ċ import Ġcom . avail . descriptor . types . A _ Type . Companion . phrase Type Expression Type Ċ import Ġcom . avail . descriptor . types . A _ Type . Companion . size Range Ċ import Ġcom . avail . descriptor . types . A _ Type . Companion . upper Bound Ċ import Ġcom . avail . descriptor . types . List Phrase TypeDescriptor Ċ import Ġcom . avail . descriptor . types . Phrase TypeDescriptor . Phrase Kind Ċ import Ġcom . avail . descriptor . types . Tuple TypeDescriptor . Companion . tuple Type From Tuple Of Types Ċ import Ġcom . avail . descriptor . types . TypeDescriptor . Types Ċ import Ġcom . avail . descriptor . types . Type Tag Ċ import Ġcom . avail . serialization . Serializer Operation Ċ import Ġcom . avail . utility . json . JSON Writer Ċ Ċ /** Ċ Ġ* ĠMac ros Ġare Ġextremely Ġhy gi en ic Ġin ĠAv ail . Ġ ĠThey Ġare Ġdefined Ġalmost Ġexactly Ġlike Ċ Ġ* Ġordinary Ġmult ime thod s . Ġ ĠThe Ġfirst Ġdifference Ġis Ġwhich Ġprimitive Ġis Ġused Ġto Ċ Ġ* Ġdefine Ġa Ġmacro Ġvers us Ġa Ġmethod . Ġ ĠThe Ġother Ġdifference Ġis Ġthat Ġinstead Ġof Ċ Ġ* Ġgenerating Ġcode Ġat Ġan Ġoccurrence Ġto Ġcall Ġa Ġmethod Ġ( a Ġcall Ġsite ), Ġthe Ġmacro Ċ Ġ* Ġbody Ġis Ġimmediately Ġinvoked , Ġpassing Ġthe Ġ[ ph rases ][ Phrase Descriptor ] Ġthat Ċ Ġ* Ġocc upy Ġthe Ġcorresponding Ġargument Ġpositions Ġin Ġthe Ġmethod / macro Ġname . ĠThe Ċ Ġ* Ġmacro Ġbody Ġwill Ġthen Ġdo Ġwhat Ġit Ġdoes Ġand Ġreturn Ġa Ġsuitable Ġreplacement Ċ Ġ* Ġphrase . Ċ Ġ* Ċ Ġ* ĠInstead Ġof Ġreturning Ġa Ġnew Ġphrase , Ġa Ġmacro Ġbody Ġmay Ġinstead Ġreject Ġparsing , Ċ Ġ* Ġthe Ġsame Ġway Ġa Ġ[ semantic &# 3 2 ; restriction ][ Semantic Restriction Descriptor ] Ġmay . Ċ Ġ* ĠAs Ġyou Ġmight Ġexpect , Ġthe Ġdiagnostic Ġmessage Ġprovided Ġto Ġthe Ġparse Ġrejection Ċ Ġ* Ġprimitive Ġwill Ġbe Ġpresented Ġto Ġthe Ġuser . Ċ Ġ* Ċ Ġ* ĠAs Ġwith Ġmethods , Ġrepeated Ġarguments Ġof Ġmacros Ġare Ġindicated Ġwith Ġgu il leme ts Ċ Ġ* Ġ(` Â « Â» `) Ġand Ġthe Ġdouble - d agger Ġ(` âĢ ¡ `). Ġ ĠThe Ġtype Ġof Ġsuch Ġan Ġargument Ġfor Ġa Ċ Ġ* Ġmethod Ġis Ġa Ġtuple Ġof Ġtuples Ġwhose Ġelements Ġcorrespond Ġto Ġthe Ġunders cores Ċ Ġ* Ġ(` _ `) Ġand Ġgu ille met Ġgroups Ġcontained Ġthere in . Ġ ĠWhen Ġexactly Ġone Ġunderscore Ġor Ċ Ġ* Ġgu ille met Ġgroup Ġoccurs Ġwithin Ġa Ġgroup , Ġthen Ġa Ġsimple Ġtuple Ġof Ġvalues Ġis Ċ Ġ* Ġexpected Ġ( r ather Ġthan Ġa Ġtuple Ġof Ġsize - one Ġtuples ). Ġ ĠMac ros Ġexpect Ġtuples Ġin Ċ Ġ* Ġan Ġanalog ous Ġway , Ġbut Ġ( 1 ) Ġthe Ġbottom - level Ġpieces Ġare Ġalways Ġphrases , Ġand Ġ( 2 ) Ċ Ġ* Ġthe Ġgrouping Ġis Ġactually Ġvia Ġ[ list &# 3 2 ; ph rases ][ List Phrase Descriptor ] Ġrather Ċ Ġ* Ġthan Ġtuples . Ġ ĠThus , Ġa Ġmacro Ġalways Ġoper ates Ġon Ġphrases . Ċ Ġ* Ċ Ġ* Ġ@ constructor Ċ Ġ* Ċ Ġ* Ġ@ param Ġmut ability Ċ Ġ* ĠĠ ĠThe Ġ[ mut ability ][ Mut ability ] Ġof Ġthe Ġnew Ġdescriptor . Ċ Ġ* Ċ Ġ* Ġ@ author ĠMark Ġvan ĠG ul ik Ġ& lt ; mark @ avail lang . org & gt ; Ċ Ġ*/ Ċ class ĠMacro Descriptor Ġprivate Ġconstructor ( Ċ ĉ mut ability : ĠMut ability Ċ ) Ġ: ĠDescriptor ( mut ability , ĠType Tag . MACRO _ TAG , ĠObject Slots :: class . java , Ġnull ) Ġ{ Ċ ĉ /** Ċĉ Ġ* ĠThe Ġlayout Ġof Ġobject Ġslots Ġfor Ġmy Ġinstances . Ċĉ Ġ*/ Ċ ĉ enum Ġclass ĠObject Slots Ġ: ĠObject Slots Enum Ġ{ Ċĉ ĉ /** Ċĉĉ Ġ* ĠThe Ġ[ A _ Bundle ] Ġfor Ġwhich Ġthis Ġmacro Ġis Ġdefined . Ċĉĉ Ġ*/ Ċĉ ĉ B UNDLE , ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠThe Ġ[ module ][ Module Descriptor ] Ġin Ġwhich Ġthis Ġdefinition Ġoccurs . Ċĉĉ Ġ*/ Ċĉ ĉ @ Hide Field Just For Print ing Ċĉ ĉ MODULE , ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠThe Ġ[ function ][ Function Descriptor ] Ġto Ġinvoke Ġto Ġtransform Ġthe Ċĉĉ Ġ* Ġ( complete ) Ġargument Ġphrases Ġinto Ġa Ġsuitable Ġreplacement Ġphrase . Ċĉĉ Ġ*/ Ċĉ ĉ BODY _ BLOCK , ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠA Ġ[ tuple ][ A _ Tuple ] Ġof Ġ[ functions ][ A _ Function ] Ġcorresponding Ġwith Ċĉĉ Ġ* Ġoccurrences Ġof Ġsection Ġcheck points Ġ(` " Â§ "` ) Ġin Ġthe Ġmessage Ġname . Ġ ĠEach Ċĉĉ Ġ* Ġfunction Ġtakes Ġthe Ġcollected Ġargument Ġphrases Ġthus Ġfar , Ġand Ġhas Ġthe Ċĉĉ Ġ* Ġopportunity Ġto Ġreject Ġthe Ġparse Ġor Ġread / write Ġparse - specific Ċĉĉ Ġ* Ġinformation Ġin Ġa Ġfiber - specific Ġvariable Ġwith Ġthe Ġkey Ċĉĉ Ġ* Ġ[ Special Atom . CLIENT _ DATA _ GLOBAL _ KEY ]. Ċĉĉ Ġ*/ Ċĉ ĉ @ Hide Field Just For Print ing Ċĉ ĉ MACRO _ PREFIX _ FUNCTION S ; Ċ ĉ } ĊĊ ĉ override Ġfun Ġo _ Definition Module ( self : ĠAv ail Object ): ĠA _ Module Ġ= Ċĉ ĉ self . slot ( MODULE ) ĊĊ ĉ override Ġfun Ġo _ Definition ModuleName ( self : ĠAv ail Object ): ĠA _ String Ċ ĉ { Ċĉ ĉ val Ġmodule : ĠA _ Module Ġ= Ġself . slot ( MODULE ) Ċĉ ĉ return Ġif Ġ( module . equals Nil ()) Ġ{ Ċĉĉ ĉ built In No ModuleName Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ module . moduleName () Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġo _ Equals ( self : ĠAv ail Object , Ġanother : ĠA _ Basic Object ) Ġ= Ċĉ ĉ another . tra versed (). same Address As ( self ) ĊĊ ĉ override Ġfun Ġo _ Body Block ( self : ĠAv ail Object ): ĠA _ Function Ġ= Ċĉ ĉ self . slot ( BODY _ BLOCK ) ĊĊ ĉ override Ġfun Ġo _ Body Signature ( self : ĠAv ail Object ): ĠA _ Type Ġ= Ċĉ ĉ self . slot ( BODY _ BLOCK ). kind () ĊĊ ĉ override Ġfun Ġo _ Definition Bundle ( self : ĠAv ail Object ): ĠA _ Bundle Ġ= Ċĉ ĉ self . slot ( B UNDLE ) ĊĊ ĉ override Ġfun Ġo _ Hash ( self : ĠAv ail Object ): ĠInt Ġ= Ċĉ ĉ self . body Block (). hash () Ġxor Ġ 0 x 6 7 f 6 ec 5 6 Ġ+ Ġ 0 x 0 AF B 0 E 6 2 ĊĊ ĉ override Ġfun Ġo _ Kind ( self : ĠAv ail Object ): ĠA _ Type Ġ= ĠTypes . MACRO _ DEFINITION . o ĊĊ ĉ override Ġfun Ġo _ Parsing Signature ( self : ĠAv ail Object ): ĠA _ Type Ċ ĉ { Ċĉ ĉ // ĠA Ġmacro Ġdefinition 's Ġparsing Ġsignature Ġis Ġa Ġlist Ġphrase Ġtype Ġwhose Ċĉ ĉ // Ġco variant Ġsub expressions Ġtype Ġis Ġthe Ġbody Ġblock 's Ġkind 's Ġarguments Ċĉ ĉ // Ġtype . Ċĉ ĉ val Ġargs Tuple Type Ġ= Ġself . slot ( BODY _ BLOCK ). kind (). args Tuple Type () Ċĉ ĉ val Ġsizes Ġ= Ġargs Tuple Type . size Range () Ċĉ ĉ assert ( sizes . lower Bound (). extract Int () Ċĉĉ ĉ == Ġsizes . upper Bound (). extract Int ()) Ċĉ ĉ assert ( sizes . lower Bound (). extract Int () Ġ== Ġself . slot ( B UNDLE ). num Args ()) Ċĉ ĉ // ĠTODO ĠM v G Ġ- Ġ 2 0 1 6 - 0 8 - 2 1 Ġdeal Ġwith Ġpermutation Ġof Ġmain Ġlist . Ċĉ ĉ return ĠList Phrase TypeDescriptor . create List NodeType ( Ċĉĉ ĉ Phrase Kind . LIST _ PH R ASE , Ċĉĉ ĉ tuple Type From Tuple Of Types ( args Tuple Type ) Ġ{ Ċĉĉĉ ĉ it . phrase Type Expression Type () Ċĉĉ ĉ }, Ċĉĉ ĉ args Tuple Type ) Ċ ĉ } ĊĊ ĉ override Ġfun Ġo _ Prefix Functions ( self : ĠAv ail Object ): ĠA _ Tuple Ġ= Ċĉ ĉ self . slot ( MACRO _ PREFIX _ FUNCTION S ) ĊĊ ĉ override Ġfun Ġo _ Serializer Operation ( self : ĠAv ail Object ) Ġ= Ċĉ ĉ Serializer Operation . MACRO _ DEFINITION ĊĊ ĉ override Ġfun Ġo _ WriteTo ( self : ĠAv ail Object , Ġwriter : ĠJSON Writer ) Ġ= Ċĉ ĉ writer . write Object Ġ{ Ċĉĉ ĉ at (" kind ") Ġ{ Ġwrite (" macro Ġdefinition ") Ġ} Ċĉĉ ĉ at (" definition Ġmethod ") Ġ{ Ċĉĉĉ ĉ self . definition Bundle (). message (). atom Name (). writeTo ( writer ) Ċĉĉ ĉ } Ċĉĉ ĉ at (" definition Ġmodule ") Ġ{ Ċĉĉĉ ĉ self . definition ModuleName (). writeTo ( writer ) Ċĉĉ ĉ } Ċĉĉ ĉ at (" body Ġblock ") Ġ{ Ġself . slot ( BODY _ BLOCK ). writeTo ( writer ) Ġ} Ċĉĉ ĉ at (" macro Ġprefix Ġfunctions ") Ġ{ Ċĉĉĉ ĉ self . slot ( MACRO _ PREFIX _ FUNCTION S ). writeTo ( writer ) Ċĉĉ ĉ } Ċĉ ĉ } ĊĊ ĉ override Ġfun Ġo _ Write Summary To ( self : ĠAv ail Object , Ġwriter : ĠJSON Writer ) Ġ= Ċĉ ĉ writer . write Object Ġ{ Ċĉĉ ĉ at (" kind ") Ġ{ Ġwrite (" macro Ġdefinition ") Ġ} Ċĉĉ ĉ at (" definition Ġmethod ") Ġ{ Ċĉĉĉ ĉ self . definition Bundle (). message (). atom Name (). writeTo ( writer ) Ċĉĉ ĉ } Ċĉĉ ĉ at (" definition Ġmodule ") Ġ{ Ċĉĉĉ ĉ self . definition ModuleName (). writeTo ( writer ) Ċĉĉ ĉ } Ċĉĉ ĉ at (" body Ġblock ") Ġ{ Ġself . slot ( BODY _ BLOCK ). write Summary To ( writer ) Ġ} Ċĉĉ ĉ at (" macro Ġprefix Ġfunctions ") Ġ{ Ċĉĉĉ ĉ self . slot ( MACRO _ PREFIX _ FUNCTION S ). write Summary To ( writer ) Ċĉĉ ĉ } Ċĉ ĉ } ĊĊ ĉ override Ġfun Ġmutable () Ġ= Ġmutable ĊĊ ĉ // ĠThere Ġis Ġno Ġimmutable Ġvariant . Ċ ĉ override Ġfun Ġimmutable () Ġ= Ġshared ĊĊ ĉ override Ġfun Ġshared () Ġ= Ġshared ĊĊ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ /** Ċĉĉ Ġ* ĠCreate Ġa Ġnew Ġmacro Ġsignature Ġfrom Ġthe Ġprovided Ġargument . Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ param Ġbundle Ċĉĉ Ġ* ĠĠ ĠThe Ġ[ A _ Bundle ] Ġthat Ġnames Ġthe Ġmacro . Ċĉĉ Ġ* Ġ@ param Ġdefinition Module Ċĉĉ Ġ* ĠĠ ĠThe Ġmodule Ġin Ġwhich Ġthis Ġmacro Ġis Ġadded . Ċĉĉ Ġ* Ġ@ param Ġbody Block Ċĉĉ Ġ* ĠĠ ĠThe Ġbody Ġof Ġthe Ġsignature . Ġ ĠThis Ġwill Ġbe Ġinvoked Ġwhen Ġa Ġcall Ġsite Ċĉĉ Ġ* ĠĠ Ġis Ġcompiled , Ġpassing Ġthe Ġsub expressions Ċĉĉ Ġ* ĠĠ Ġ([ ph rases ][ Phrase Descriptor ]) Ġas Ġarguments . Ċĉĉ Ġ* Ġ@ param Ġprefix Functions Ċĉĉ Ġ* ĠĠ ĠThe Ġtuple Ġof Ġprefix Ġfunctions Ġthat Ġcorrespond Ġwith Ġthe Ġsection Ċĉĉ Ġ* ĠĠ Ġcheck points Ġ(` " Â§ "` ) Ġin Ġthe Ġmacro 's Ġname . Ċĉĉ Ġ* Ġ@ return Ċĉĉ Ġ* ĠĠ ĠA Ġmacro Ġdefinition . Ċĉĉ Ġ*/ Ċĉ ĉ @ Jvm Static Ċĉ ĉ fun Ġnew Macro Definition ( Ċĉĉ ĉ bundle : ĠA _ Bundle , Ċĉĉ ĉ definition Module : ĠA _ Module , Ċĉĉ ĉ body Block : ĠA _ Function , Ċĉĉ ĉ prefix Functions : ĠA _ Tuple Ċĉ ĉ ): ĠA _ Macro Ġ= Ġmutable . create Shared Ġ{ Ċĉĉ ĉ set Slot ( B UNDLE , Ġbundle ) Ċĉĉ ĉ set Slot ( MODULE , Ġdefinition Module ) Ċĉĉ ĉ set Slot ( BODY _ BLOCK , Ġbody Block ) Ċĉĉ ĉ set Slot ( MACRO _ PREFIX _ FUNCTION S , Ġprefix Functions ) Ċĉ ĉ } ĊĊĉ ĉ /** ĠThe Ġmutable Ġ[ Macro Descriptor ]. Ġ Ġ*/ Ċĉ ĉ private Ġval Ġmutable Ġ= ĠMacro Descriptor ( Mut ability . MUT ABLE ) ĊĊĉ ĉ /** ĠThe Ġshared Ġ[ Macro Descriptor ]. Ġ Ġ*/ Ċĉ ĉ private Ġval Ġshared Ġ= ĠMacro Descriptor ( Mut ability . SHARED ) Ċ ĉ } Ċ } Ċ