/** Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠIsl on ĠSch er er Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġnov ah . frontend Ċ Ċ import Ġio . kot est . assertions . throw ables . should Not Throw Any Ċ import Ġio . kot est . assertions . throw ables . should Throw Ċ import Ġio . kot est . core . spec . style . String Spec Ċ import Ġio . kot est . matchers . shouldBe Ċ import Ġnov ah . frontend . TestUtil . module Ċ import Ġnov ah . frontend . TestUtil . simple Name Ċ import Ġnov ah . frontend . type checker .* Ċ import Ġnov ah . main . Compilation Error Ċ Ċ class ĠType checker Spec Ġ: ĠString Spec ({ ĊĊĠĠĠ Ġfun Ġexpr X ( expr : ĠString ) Ġ= Ġ" x Ġ= Ġ$ expr ". module () ĊĊĠĠĠ Ġfun Ġinfer X ( expr : ĠString ): ĠType Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTest Util . compile Code ( expr X ( expr )). env . decl s [" x "] !!. type ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinfer FX ( expr : ĠString ): ĠType Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTest Util . compile Code (" f Ġ_ Ġ= Ġ$ expr ". module ()). env . decl s [" f "] !!. type ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" type check Ġprimitive Ġexpressions " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġt int Ġ= Ġinfer X (" 3 4 ") ĊĠĠĠĠĠĠĠ Ġval Ġt long Ġ= Ġinfer X (" 3 4 L ") ĊĠĠĠĠĠĠĠ Ġval Ġt float Ġ= Ġinfer X (" 3 4 . 0 F ") ĊĠĠĠĠĠĠĠ Ġval Ġt double Ġ= Ġinfer X (" 3 4 . 0 ") ĊĠĠĠĠĠĠĠ Ġval Ġt string Ġ= Ġinfer X ("\" asd \" ") ĊĠĠĠĠĠĠĠ Ġval Ġt char Ġ= Ġinfer X ("' A '") ĊĠĠĠĠĠĠĠ Ġval Ġt boolean Ġ= Ġinfer X (" false ") ĊĊĠĠĠĠĠĠĠ Ġt int ĠshouldBe Ġt Int 3 2 ĊĠĠĠĠĠĠĠ Ġt long ĠshouldBe Ġt Int 6 4 ĊĠĠĠĠĠĠĠ Ġt float ĠshouldBe Ġt Float 3 2 ĊĠĠĠĠĠĠĠ Ġt double ĠshouldBe Ġt Float 6 4 ĊĠĠĠĠĠĠĠ Ġt string ĠshouldBe Ġt String ĊĠĠĠĠĠĠĠ Ġt char ĠshouldBe Ġt Char ĊĠĠĠĠĠĠĠ Ġt boolean ĠshouldBe Ġt Boolean ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" type check Ġnumber Ġconversions " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ= Ġ 1 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġb Ġ: ĠByte ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb Ġ= Ġ 1 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġb 2 Ġ= Ġ 1 2 Ġ: ĠByte ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ: ĠInt 1 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ= Ġ 1 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġl Ġ= Ġ 9 9 9 9 9 9 9 9 ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġl 2 Ġ= Ġ 1 2 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġd Ġ= Ġ 1 2 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġf Ġ= Ġ 1 2 . 0 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġbi Ġ= Ġ 0 b 1 1 0 1 0 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġbi 2 Ġ= Ġ 0 b 1 1 0 1 0 1 1 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġbi 3 Ġ: ĠByte ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbi 3 Ġ= Ġ 0 b 1 1 0 1 0 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġhex Ġ= Ġ 0 xFF ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġhex 2 Ġ= Ġ 0 xFF L ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġhex 3 Ġ: ĠInt 1 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhex 3 Ġ= Ġ 0 xFF ĊĠĠĠĠĠĠĠ Ġ""" . module () ĊĊĠĠĠĠĠĠĠ Ġval Ġt ys Ġ= ĠTest Util . compile Code ( code ). env . decl s ĊĊĠĠĠĠĠĠĠ Ġt ys [" i "] ?. type ĠshouldBe Ġt Int 3 2 ĊĠĠĠĠĠĠĠ Ġt ys [" b "] ?. type ĠshouldBe Ġt Byte ĊĠĠĠĠĠĠĠ Ġt ys [" b 2 "] ?. type ĠshouldBe Ġt Byte ĊĠĠĠĠĠĠĠ Ġt ys [" s "] ?. type ĠshouldBe Ġt Int 1 6 ĊĠĠĠĠĠĠĠ Ġt ys [" l "] ?. type ĠshouldBe Ġt Int 3 2 ĊĠĠĠĠĠĠĠ Ġt ys [" l 2 "] ?. type ĠshouldBe Ġt Int 6 4 ĊĠĠĠĠĠĠĠ Ġt ys [" d "] ?. type ĠshouldBe Ġt Float 6 4 ĊĠĠĠĠĠĠĠ Ġt ys [" f "] ?. type ĠshouldBe Ġt Float 3 2 ĊĠĠĠĠĠĠĠ Ġt ys [" bi "] ?. type ĠshouldBe Ġt Int 3 2 ĊĠĠĠĠĠĠĠ Ġt ys [" bi 2 "] ?. type ĠshouldBe Ġt Int 6 4 ĊĠĠĠĠĠĠĠ Ġt ys [" bi 3 "] ?. type ĠshouldBe Ġt Byte ĊĠĠĠĠĠĠĠ Ġt ys [" hex "] ?. type ĠshouldBe Ġt Int 3 2 ĊĠĠĠĠĠĠĠ Ġt ys [" hex 2 "] ?. type ĠshouldBe Ġt Int 6 4 ĊĠĠĠĠĠĠĠ Ġt ys [" hex 3 "] ?. type ĠshouldBe Ġt Int 1 6 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" type check Ġif " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġty Ġ= Ġinfer FX (" if Ġfalse Ġthen Ġ 0 Ġelse Ġ 1 ") ĊĊĠĠĠĠĠĠĠ Ġty . simple Name () ĠshouldBe Ġ" t 1 Ġ-> ĠInt 3 2 " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" type check Ġsub su med Ġif " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġx Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġf Ġ_ Ġ= Ġif Ġtrue Ġthen Ġ 1 0 Ġelse Ġid Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf 2 Ġa Ġ= Ġif Ġtrue Ġthen Ġ 1 0 Ġelse Ġid Ġa ĊĠĠĠĠĠĠĠ Ġ""" . module () ĊĊĠĠĠĠĠĠĠ Ġval Ġt ys Ġ= ĠTest Util . compile Code ( code ). env . decl s ĊĊĠĠĠĠĠĠĠ Ġt ys [" f "] ?. type ?. simple Name () ĠshouldBe Ġ" t 1 Ġ-> ĠInt 3 2 " ĊĠĠĠĠĠĠĠ Ġt ys [" f 2 "] ?. type ?. simple Name () ĠshouldBe Ġ" Int 3 2 Ġ-> ĠInt 3 2 " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" type check Ġgener ics " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġty Ġ= Ġinfer X ("\\ y Ġ-> Ġy ") ĊĊĠĠĠĠĠĠĠ Ġty . simple Name () ĠshouldBe Ġ" t 1 Ġ-> Ġt 1 " ĊĊĠĠĠĠĠĠĠ Ġval Ġty 2 Ġ= Ġinfer FX ("( \\ y Ġ-> Ġy ) Ġfalse ") ĊĊĠĠĠĠĠĠĠ Ġty 2 . simple Name () ĠshouldBe Ġ" t 1 Ġ-> ĠBoolean " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" type check Ġpre - added Ġcontext Ġvars " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġty Ġ= Ġinfer FX (" toString Ġ 1 0 ") ĊĊĠĠĠĠĠĠĠ Ġty . simple Name () ĠshouldBe Ġ" t 1 Ġ-> ĠString " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" type check Ġlet " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf Ġ() Ġ= Ġlet Ġa Ġ= Ġ" bl a " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġlet Ġy Ġ= Ġa ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġy ĊĠĠĠĠĠĠĠ Ġ""" . module () ĊĊĠĠĠĠĠĠĠ Ġval Ġty Ġ= ĠTest Util . compile Code ( code ). env . decl s [" f "] ĊĊĠĠĠĠĠĠĠ Ġty ?. type ?. simple Name () ĠshouldBe Ġ" Unit Ġ-> ĠString " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" type check Ġpol ymorphic Ġlet Ġbindings " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf Ġ_ Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġid Ġa Ġ= Ġa ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġ""" . module () ĊĊĠĠĠĠĠĠĠ Ġval Ġty Ġ= ĠTest Util . compile Code ( code ). env . decl s [" f "] ĊĊĠĠĠĠĠĠĠ Ġty ?. type ?. simple Name () ĠshouldBe Ġ" t 1 Ġ-> ĠInt 3 2 " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" type check Ġdo Ġstatements " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf Ġ_ Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln Ġ" hello Ġworld " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtoString Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln Ġ( toString Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ""" . module () ĊĊĠĠĠĠĠĠĠ Ġval Ġty Ġ= ĠTest Util . compile Code ( code ). env . decl s [" f "] !!. type ĊĊĠĠĠĠĠĠĠ Ġty . simple Name () ĠshouldBe Ġ" t 1 Ġ-> ĠBoolean " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" type check Ġdo Ġstatements Ġwith Ġlet " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf Ġ() Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġv Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġhundred Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtoString Ġv ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln Ġ( toString Ġhundred ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġret Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret ĊĠĠĠĠĠĠĠ Ġ""" . module () ĊĊĠĠĠĠĠĠĠ Ġval Ġty Ġ= ĠTest Util . compile Code ( code ). env . decl s [" f "] !!. type ĊĊĠĠĠĠĠĠĠ Ġty . simple Name () ĠshouldBe Ġ" Unit Ġ-> ĠBoolean " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" type check Ġa Ġrecursive Ġfunction " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfact Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcase Ġ_ Ġof ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ-> Ġx Ġ* Ġfact Ġ( x Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ""" . module () ĊĊĠĠĠĠĠĠĠ Ġval Ġty Ġ= ĠTest Util . compile Code ( code ). env . decl s [" fact "] ĊĊĠĠĠĠĠĠĠ Ġty ?. type ?. simple Name () ĠshouldBe Ġ" Int 3 2 Ġ-> ĠInt 3 2 " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" type check Ġmut ually Ġrecursive Ġfunctions " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf 1 Ġ: ĠInt Ġ-> ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf 1 Ġx Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġx Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthen Ġf 2 Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġx Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġf 2 Ġ: ĠInt Ġ-> ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf 2 Ġx Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġx Ġ<= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthen Ġf 1 Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġx Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ""" . module () ĊĊĠĠĠĠĠĠĠ Ġshould Not Throw Any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest Util . compile Code ( code ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" high Ġrank ed Ġtypes Ġdon 't Ġcompile " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĠTuple Ġa Ġb Ġ= ĠTuple Ġa Ġb ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// fun Ġ: Ġ( forall Ġa . Ġa Ġ-> Ġa ) Ġ-> ĠTuple ĠInt ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġf Ġ= ĠTuple Ġ( f Ġ 1 ) Ġ( f Ġ" a ") ĊĠĠĠĠĠĠĠ Ġ""" . module () ĊĊĠĠĠĠĠĠĠ Ġshould Throw < Compilation Error > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest Util . compile Code ( code ). env . decl s [" fun "] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" type check Ġrecursive Ġlets " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġn Ġs Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġrec Ġx Ġy Ġ= Ġif Ġx Ġ== Ġ 1 Ġthen Ġy Ġelse Ġrec Ġ 1 Ġy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġrec Ġn Ġs ĊĠĠĠĠĠĠĠ Ġ""" . module () ĊĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠTest Util . compile Code ( code ). env . decl s ĊĊĠĠĠĠĠĠĠ Ġres [" fun "] ?. type ?. simple Name () ĠshouldBe Ġ" Int 3 2 Ġ-> Ġt 1 Ġ-> Ġt 1 " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Ali ased Ġoperators Ġare Ġcorrectly Ġcompiled " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġnov ah . link edList Ġas ĠL ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġ 1 ĠL . :: ĠL . Nil ĊĠĠĠĠĠĠĠ Ġ""" . module () ĊĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠTest Util . compile Code ( code ). env . decl s ĊĠĠĠĠĠĠĠ Ġres [" x "] ?. type ?. simple Name () ĠshouldBe Ġ" LinkedList ĠInt 3 2 " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" shadow ing Ġof Ġqualified Ġvars Ġwork " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb la Ġ: ĠInt 3 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb la Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġcount Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList . count Ġidentity Ġ[ true ] ĊĠĠĠĠĠĠĠ Ġ""" . module () ĊĊĠĠĠĠĠĠĠ ĠTest Util . compile Code ( code ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" statements Ġcan Ġhave Ġmultiple Ġexpressions " Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforeign Ġimport Ġjava . lang . Exception ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ() Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġtrue Ġdo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġx Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun 2 Ġ() Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġx Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ: ? ĠException Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠ Ġ""" . module () ĊĊĠĠĠĠĠĠĠ ĠTest Util . compile Code ( code ) ĊĠĠĠ Ġ} Ċ })