package Ġme . w ol le mat . s ake . v 2 . des ug arer Ċ Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Abstract Syntax Tree Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Add Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . And Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Append Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Application Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Array Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Concat Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Div Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Eq Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Expression Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Fail Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . False Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Float Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Ge Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Gt Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . If Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Integer Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Lambda Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Le Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Lt Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Mult Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Neg Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . N eq Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Nil Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Not Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Null Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Or Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Print Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Rem Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . String Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Sub Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . True Node Ċ import Ġme . w ol le mat . s ake . v 2 . parser . Variable Node Ċ Ċ class ĠS ake Des ug arer ( val Ġast : ĠAbstract Syntax Tree ) Ġ{ ĊĠĠĠ Ġfun Ġdes ugar (): ĠDes ug ared Abstract Syntax Tree Ġ= ĊĠĠĠĠĠĠĠ ĠDes ug ared Abstract Syntax Tree ( ast . funcs . map Ġ{ ĠFunction Core ( it . id , Ġit . params , Ġdes ugar ( it . expr )) Ġ}) ĊĊĠĠĠ Ġprivate Ġfun Ġdes ugar ( expr : ĠExpression Node ): ĠExpression Core Ġ= Ġwhen Ġ( expr ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠIf Node Ġ-> ĠIf Core ( des ugar ( expr . cond ), Ġdes ugar ( expr . left ), Ġdes ugar ( expr . right )) ĊĠĠĠĠĠĠĠ Ġis ĠVariable Node Ġ-> ĠVariable Core ( expr . id ) ĊĊĠĠĠĠĠĠĠ Ġis ĠAdd Node Ġ-> ĠAdd Core ( des ugar ( expr . left ), Ġdes ugar ( expr . right )) ĊĠĠĠĠĠĠĠ Ġis ĠSub Node Ġ-> ĠAdd Core ( des ugar ( expr . left ), ĠMult Core ( Integer Core (- 1 ), Ġdes ugar ( expr . right ))) ĊĠĠĠĠĠĠĠ Ġis ĠMult Node Ġ-> ĠMult Core ( des ugar ( expr . left ), Ġdes ugar ( expr . right )) ĊĠĠĠĠĠĠĠ Ġis ĠDiv Node Ġ-> ĠDiv Core ( des ugar ( expr . left ), Ġdes ugar ( expr . right )) ĊĠĠĠĠĠĠĠ Ġis ĠRem Node Ġ-> ĠRem Core ( des ugar ( expr . left ), Ġdes ugar ( expr . right )) ĊĠĠĠĠĠĠĠ Ġis ĠNeg Node Ġ-> ĠMult Core ( Integer Core (- 1 ), Ġdes ugar ( expr . expr )) ĊĊĠĠĠĠĠĠĠ Ġis ĠAnd Node Ġ-> ĠN and Core ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN and Core ( des ugar ( expr . left ), Ġdes ugar ( expr . right )), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN and Core ( des ugar ( expr . left ), Ġdes ugar ( expr . right )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġis ĠOr Node Ġ-> ĠN and Core ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN and Core ( des ugar ( expr . left ), Ġdes ugar ( expr . left )), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN and Core ( des ugar ( expr . right ), Ġdes ugar ( expr . right )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġis ĠNot Node Ġ-> ĠN and Core ( des ugar ( expr . expr ), Ġdes ugar ( expr . expr )) ĊĊĠĠĠĠĠĠĠ Ġis ĠGe Node Ġ-> Ġdes ugar ( Or Node ( Gt Node ( expr . left , Ġexpr . right ), ĠEq Node ( expr . left , Ġexpr . right ))) ĊĠĠĠĠĠĠĠ Ġis ĠG t Node Ġ-> ĠL t Core ( des ugar ( expr . right ), Ġdes ugar ( expr . left )) ĊĠĠĠĠĠĠĠ Ġis ĠLe Node Ġ-> Ġdes ugar ( Or Node ( Lt Node ( expr . left , Ġexpr . right ), ĠEq Node ( expr . left , Ġexpr . right ))) ĊĠĠĠĠĠĠĠ Ġis ĠL t Node Ġ-> ĠL t Core ( des ugar ( expr . left ), Ġdes ugar ( expr . right )) ĊĠĠĠĠĠĠĠ Ġis ĠEq Node Ġ-> ĠEq Core ( des ugar ( expr . left ), Ġdes ugar ( expr . right )) ĊĠĠĠĠĠĠĠ Ġis ĠN eq Node Ġ-> Ġdes ugar ( Not Node ( Eq Node ( expr . left , Ġexpr . right ))) ĊĊĠĠĠĠĠĠĠ Ġis ĠArray Node Ġ-> ĠArray Core ( des ugar ( expr . list ), Ġdes ugar ( expr . index )) ĊĠĠĠĠĠĠĠ Ġis ĠConcat Node Ġ-> ĠConcat Core ( des ugar ( expr . left ), Ġdes ugar ( expr . right )) ĊĠĠĠĠĠĠĠ Ġis ĠAppend Node Ġ-> ĠAppend Core ( des ugar ( expr . head ), Ġdes ugar ( expr . tail )) ĊĊĠĠĠĠĠĠĠ Ġis ĠApplication Node Ġ-> ĠApplication Core ( des ugar ( expr . func ), Ġexpr . args . map Ġ{ Ġdes ugar ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġis ĠLambda Node Ġ-> ĠLambda Core ( expr . params , Ġdes ugar ( expr . expr )) ĊĠĠĠĠĠĠĠ Ġis ĠPrint Node Ġ-> ĠPrint Core ( des ugar ( expr . msg )) ĊĠĠĠĠĠĠĠ Ġis ĠFail Node Ġ-> ĠFail Core ( des ugar ( expr . msg )) ĊĊĠĠĠĠĠĠĠ Ġis ĠString Node Ġ-> ĠString Core ( expr . str ) ĊĠĠĠĠĠĠĠ Ġis ĠFloat Node Ġ-> ĠFloat Core ( expr . num ) ĊĠĠĠĠĠĠĠ Ġis ĠInteger Node Ġ-> ĠInteger Core ( expr . num ) ĊĊĠĠĠĠĠĠĠ ĠTrue Node Ġ-> ĠTrue Core ĊĠĠĠĠĠĠĠ ĠFalse Node Ġ-> ĠFalse Core ĊĠĠĠĠĠĠĠ ĠNil Node Ġ-> ĠNil Core ĊĠĠĠĠĠĠĠ ĠNull Node Ġ-> ĠNull Core ĊĠĠĠ Ġ} Ċ } Ċ