package Ġj du an Ċ Ċ interface ĠExpr Ċ Ċ class ĠNum ( val Ġvalue : ĠInt ) Ġ: ĠExpr Ċ Ċ class ĠSum ( val Ġleft : ĠExpr , Ġval Ġright : ĠExpr ) Ġ: ĠExpr Ċ Ċ fun Ġeval ( expr : ĠExpr ): ĠInt Ġ= ĊĠĠĠ Ġif Ġ( expr Ġis ĠNum ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġsmart Ġcast : Ġthe Ġcompiler Ġknows Ġthe Ġtype Ġof Ġexpr Ġis ĠNum Ġhere ĊĠĠĠĠĠĠĠ Ġ// Ġyou Ġcan Ġalso Ġperform Ġan Ġexplicit Ġcast Ġif Ġyou Ġwant Ġto : ĊĠĠĠĠĠĠĠ Ġ// Ġval Ġn Ġ= Ġexpr Ġas ĠNum ĊĠĠĠĠĠĠĠ Ġexpr . value ĊĠĠĠ Ġ} Ġelse Ġif Ġ( expr Ġis ĠSum ) Ġ{ ĊĠĠĠĠĠĠĠ Ġeval ( expr . left ) Ġ+ Ġeval ( expr . right ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Unknown Ġexpression !") ĊĠĠĠ Ġ} Ċ Ċ fun Ġeval 2 ( expr : ĠExpr ): ĠInt Ġ= ĊĠĠĠ Ġwhen Ġ( expr ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠNum Ġ-> Ġexpr . value ĊĠĠĠĠĠĠĠ Ġis ĠSum Ġ-> Ġeval ( expr . left ) Ġ+ Ġeval ( expr . right ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unknown Ġexpression !") ĊĠĠĠ Ġ} Ċ Ċ fun Ġeval With Logging ( expr : ĠExpr ): ĠInt Ġ= ĊĠĠĠ Ġwhen Ġ( expr ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠNum Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" expr Ġis Ġa Ġnumber ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠSum Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" expr Ġis Ġa ĠSum ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeval ( expr . left ) Ġ+ Ġeval ( expr . right ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unknown Ġexpression !") ĊĠĠĠ Ġ} Ċ