package Ġio . github . kar ino 2 . cal cl ark Ċ Ċ import Ġcom . google . common . collect . Immutable Map Ċ import Ġnet . star l ark . java . annot . Param Ċ import Ġnet . star l ark . java . annot . Star l ark Method Ċ import Ġnet . star l ark . java . eval .* Ċ import Ġnet . star l ark . java . syntax . File Options Ċ import Ġnet . star l ark . java . syntax . Parser Input Ċ import Ġkotlin . math .* Ċ Ċ class ĠMath Functions Ġ{ ĊĊĠĠĠ Ġfun Ġto Double ( x : ĠAny ) Ġ: ĠDouble ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStar l ark Int Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx . to Finite Double () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStar l ark Float Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsingle Arg Float Func ( x : ĠAny , Ġfname : ĠString , Ġf : Ġ( Double )-> Double ) Ġ: ĠStar l ark Float Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġto Double ( x )?. let Ġ{ ĠStar l ark Float . of ( f ( it )) Ġ} Ġ?: Ġthrow ĠStar l ark . error f (" Unsupported Ġargument Ġof Ġ$ fname . Ġ% s ", ĠStar l ark . type ( x )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtwo Arg Float Func ( x : ĠAny , Ġy : Any , Ġfname : ĠString , Ġf : Ġ( Double , ĠDouble )-> Double ) Ġ: ĠStar l ark Float Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx d Ġ= Ġto Double ( x ) Ġ?: Ġthrow ĠStar l ark . error f (" Unsupported Ġargument Ġof Ġ$ fname Ġx . Ġ% s ", ĠStar l ark . type ( x )) ĊĠĠĠĠĠĠĠ Ġval Ġy d Ġ= Ġto Double ( y ) Ġ?: Ġthrow ĠStar l ark . error f (" Unsupported Ġargument Ġof Ġ$ fname Ġy . Ġ% s ", ĠStar l ark . type ( y )) ĊĠĠĠĠĠĠĠ Ġreturn ĠStar l ark Float . of ( f ( xd , Ġy d )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠ ĠT rig on ometric Ġfunctions . ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġ@ Star l ark Method ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" acos ", ĊĠĠĠĠĠĠĠ Ġparameters Ġ= Ġ[ Param ( name Ġ= Ġ" x ") ], ĊĠĠĠĠĠĠĠ Ġdoc Ġ= Ġ" Returns Ġthe Ġarc Ġcos ine Ġ( meas ured Ġin Ġradians ) Ġof Ġx ." ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġmath A cos ( x : ĠAny ) Ġ= Ġsingle Arg Float Func ( x , Ġ" acos ", Ġ:: acos ) ĊĊĠĠĠ Ġ@ Star l ark Method ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" ac osh ", ĊĠĠĠĠĠĠĠ Ġparameters Ġ= Ġ[ Param ( name Ġ= Ġ" x ") ], ĊĠĠĠĠĠĠĠ Ġdoc Ġ= Ġ" Returns Ġthe Ġinverse Ġhyper b olic Ġcos ine Ġof Ġx ." ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġmath A co sh ( x : ĠAny ) Ġ= Ġsingle Arg Float Func ( x , Ġ" ac osh ", Ġ:: ac osh ) ĊĊĠĠĠ Ġ@ Star l ark Method ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" asin ", ĊĠĠĠĠĠĠĠ Ġparameters Ġ= Ġ[ Param ( name Ġ= Ġ" x ") ], ĊĠĠĠĠĠĠĠ Ġdoc Ġ= Ġ" Returns Ġthe Ġarc Ġs ine Ġ( meas ured Ġin Ġradians ) Ġof Ġx ." ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġmath As in ( x : ĠAny ) Ġ= Ġsingle Arg Float Func ( x , Ġ" asin ", Ġ:: asin ) ĊĊĠĠĠ Ġ@ Star l ark Method ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" as inh ", ĊĠĠĠĠĠĠĠ Ġparameters Ġ= Ġ[ Param ( name Ġ= Ġ" x ") ], ĊĠĠĠĠĠĠĠ Ġdoc Ġ= Ġ" Returns Ġthe Ġinverse Ġhyper b olic Ġsin Ġof Ġx ." ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġmath As inh ( x : ĠAny ) Ġ= Ġsingle Arg Float Func ( x , Ġ" as inh ", Ġ:: as inh ) ĊĊĠĠĠ Ġ@ Star l ark Method ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" atan ", ĊĠĠĠĠĠĠĠ Ġparameters Ġ= Ġ[ Param ( name Ġ= Ġ" x ") ], ĊĠĠĠĠĠĠĠ Ġdoc Ġ= Ġ" Returns Ġthe Ġarc Ġtangent Ġ( meas ured Ġin Ġradians ) Ġof Ġx ." ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġmath At an ( x : ĠAny ) Ġ= Ġsingle Arg Float Func ( x , Ġ" atan ", Ġ:: atan ) ĊĊĠĠĠ Ġ@ Star l ark Method ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" atan 2 ", ĊĠĠĠĠĠĠĠ Ġparameters Ġ= Ġ[ Param ( name Ġ= Ġ" x "), ĠParam ( name Ġ= Ġ" y ") ], ĊĠĠĠĠĠĠĠ Ġdoc Ġ= Ġ" Returns Ġthe Ġarc Ġtangent Ġ( meas ured Ġin Ġradians ) Ġof Ġy / x ." ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġmath At an 2 ( x : ĠAny , Ġy : Any ) Ġ= Ġtwo Arg Float Func ( x , Ġy , Ġ" atan 2 ", Ġ:: atan 2 ) ĊĊĠĠĠ Ġ@ Star l ark Method ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" atan h ", ĊĠĠĠĠĠĠĠ Ġparameters Ġ= Ġ[ Param ( name Ġ= Ġ" x ") ], ĊĠĠĠĠĠĠĠ Ġdoc Ġ= Ġ" Returns Ġthe Ġinverse Ġhyper b olic Ġtangent Ġof Ġx ." ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġmath At anh ( x : ĠAny ) Ġ= Ġsingle Arg Float Func ( x , Ġ" atan h ", Ġ:: atan h ) ĊĊĠĠĠ Ġ@ Star l ark Method ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" cos ", ĊĠĠĠĠĠĠĠ Ġparameters Ġ= Ġ[ Param ( name Ġ= Ġ" x ") ], ĊĠĠĠĠĠĠĠ Ġdoc Ġ= Ġ" Returns Ġthe Ġcos ine Ġ( meas ured Ġin Ġradians ) Ġof Ġx ." ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġmath Cos ( x : ĠAny ) Ġ= Ġsingle Arg Float Func ( x , Ġ" cos ", Ġ:: cos ) ĊĊĠĠĠ Ġ@ Star l ark Method ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" co sh ", ĊĠĠĠĠĠĠĠ Ġparameters Ġ= Ġ[ Param ( name Ġ= Ġ" x ") ], ĊĠĠĠĠĠĠĠ Ġdoc Ġ= Ġ" Returns Ġthe Ġhyper b olic Ġcos ine Ġof Ġx ." ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġmath C osh ( x : ĠAny ) Ġ= Ġsingle Arg Float Func ( x , Ġ" co sh ", Ġ:: co sh ) ĊĊĠĠĠ Ġ@ Star l ark Method ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" sin ", ĊĠĠĠĠĠĠĠ Ġparameters Ġ= Ġ[ Param ( name Ġ= Ġ" x ") ], ĊĠĠĠĠĠĠĠ Ġdoc Ġ= Ġ" Returns Ġthe Ġs ine Ġ( meas ured Ġin Ġradians ) Ġof Ġx ." ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġmath Sin ( x : ĠAny ) Ġ= Ġsingle Arg Float Func ( x , Ġ" sin ", Ġ:: sin ) ĊĊĠĠĠ Ġ@ Star l ark Method ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" sin h ", ĊĠĠĠĠĠĠĠ Ġparameters Ġ= Ġ[ Param ( name Ġ= Ġ" x ") ], ĊĠĠĠĠĠĠĠ Ġdoc Ġ= Ġ" Returns Ġthe Ġhyper b olic Ġsin Ġof Ġx ." ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġmath S inh ( x : ĠAny ) Ġ= Ġsingle Arg Float Func ( x , Ġ" sin h ", Ġ:: sin h ) ĊĊĠĠĠ Ġ@ Star l ark Method ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" tan ", ĊĠĠĠĠĠĠĠ Ġparameters Ġ= Ġ[ Param ( name Ġ= Ġ" x ") ], ĊĠĠĠĠĠĠĠ Ġdoc Ġ= Ġ" Returns Ġthe Ġtangent Ġ( meas ured Ġin Ġradians ) Ġof Ġx ." ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġmath Tan ( x : ĠAny ) Ġ= Ġsingle Arg Float Func ( x , Ġ" tan ", Ġ:: tan ) ĊĊĠĠĠ Ġ@ Star l ark Method ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" tanh ", ĊĠĠĠĠĠĠĠ Ġparameters Ġ= Ġ[ Param ( name Ġ= Ġ" x ") ], ĊĠĠĠĠĠĠĠ Ġdoc Ġ= Ġ" Returns Ġthe Ġhyper b olic Ġtangent Ġof Ġx ." ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġmath T anh ( x : ĠAny ) Ġ= Ġsingle Arg Float Func ( x , Ġ" tanh ", Ġ:: tanh ) ĊĊĠĠĠ Ġ/* ĊĠĠĠ Ġlog , Ġexp ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġ@ Star l ark Method ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" log ", ĊĠĠĠĠĠĠĠ Ġparameters Ġ= Ġ[ Param ( name Ġ= Ġ" x ") ], ĊĠĠĠĠĠĠĠ Ġdoc Ġ= Ġ" Returns Ġthe Ġln Ġof Ġits Ġargument ." ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġmath Log ( x : ĠAny ) Ġ= Ġsingle Arg Float Func ( x , Ġ" log ", Ġ:: ln ) ĊĊĠĠĠ Ġ@ Star l ark Method ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" log 1 0 ", ĊĠĠĠĠĠĠĠ Ġparameters Ġ= Ġ[ Param ( name Ġ= Ġ" x ") ], ĊĠĠĠĠĠĠĠ Ġdoc Ġ= Ġ" Returns Ġthe Ġlog Ġbase Ġ 1 0 Ġof Ġits Ġargument ." ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġmath Log 1 0 ( x : ĠAny ) Ġ= Ġsingle Arg Float Func ( x , Ġ" log 1 0 ", Ġ:: log 1 0 ) ĊĊĠĠĠ Ġ@ Star l ark Method ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" log 2 ", ĊĠĠĠĠĠĠĠ Ġparameters Ġ= Ġ[ Param ( name Ġ= Ġ" x ") ], ĊĠĠĠĠĠĠĠ Ġdoc Ġ= Ġ" Returns Ġthe Ġlog Ġbase Ġ 2 Ġof Ġits Ġargument ." ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġmath Log 2 ( x : ĠAny ) Ġ= Ġsingle Arg Float Func ( x , Ġ" log 2 ", Ġ:: log 2 ) ĊĊĠĠĠ Ġ@ Star l ark Method ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" exp ", ĊĠĠĠĠĠĠĠ Ġparameters Ġ= Ġ[ Param ( name Ġ= Ġ" x ") ], ĊĠĠĠĠĠĠĠ Ġdoc Ġ= Ġ" Returns Ġthe Ġexponential Ġof Ġx ." ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġmath Exp ( x : ĠAny ) Ġ= Ġsingle Arg Float Func ( x , Ġ" exp ", Ġ:: exp ) ĊĊĠĠĠ Ġ@ Star l ark Method ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" pow ", ĊĠĠĠĠĠĠĠ Ġparameters Ġ= Ġ[ Param ( name Ġ= Ġ" x "), ĠParam ( name Ġ= Ġ" y ") ], ĊĠĠĠĠĠĠĠ Ġdoc Ġ= Ġ" Returns Ġx Ġto Ġthe Ġpower Ġof Ġy Ġ( x ** y )." ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġmath Pow ( x : ĠAny , Ġy : ĠAny ) Ġ= Ġtwo Arg Float Func ( x , Ġy , Ġ" pow ", Ġf = Ġ{ xd , Ġy d -> Ġx d . pow ( yd ) Ġ}) Ċ } ĊĊĊ Ċ class ĠInterpreter Ġ{ ĊĠĠĠ Ġprivate Ġval ĠfileName Ġ= Ġ"< expr >" ĊĊĠĠĠ Ġprivate Ġfun Ġmake Env () Ġ: ĠMap < String , ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠImmutableMap . builder < String , ĠAny >() ĊĠĠĠĠĠĠĠ Ġbuilder . put (" pi ", ĠStar l ark Float . of ( Math . PI )) ĊĠĠĠĠĠĠĠ Ġbuilder . put (" Out ", Ġoutputs ) ĊĠĠĠĠĠĠĠ ĠStar l ark . add Methods ( builder , ĠMath Functions (), ĠStar l ark Semantics . DEFAULT ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmodule Ġ: ĠModule Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠModule . with Pre declared ( Star l ark Semantics . DEFAULT , Ġmake Env ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmutable : ĠMut ability Ġby Ġlazy Ġ{ ĠMut ability . create ( fileName ) Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġeval Thread : ĠStar l ark Thread Ġby Ġlazy Ġ{ ĠStar l ark Thread ( mutable , ĠStar l ark Semantics . DEFAULT ) Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġoutputs Ġby Ġlazy Ġ{ ĠStar l ark List . new List < Any >( eval Thread . mut ability ()) !! Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġlast Ġ: ĠAny ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġadd Output ( res : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoutputs . addElement ( res ) ĊĠĠĠĠĠĠĠ Ġmodule . set Global ("__ ", Ġlast Ġ?: ĠStar l ark . NONE ) ĊĠĠĠĠĠĠĠ Ġmodule . set Global ("_ ", Ġres ) ĊĠĠĠĠĠĠĠ Ġlast Ġ= Ġres ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġeval String ( expr : ĠString ) Ġ: ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠParser Input . fromString ( expr , ĠfileName ) ĊĠĠĠĠĠĠĠ Ġreturn ĠStar l ark . eval ( input , ĠFile Options . DEFAULT , Ġmodule , Ġeval Thread ) ĊĠĠĠ Ġ} Ċ }