import Ġkotlin . math . abs Ċ Ċ fun Ġdigit Item ( digit : ĠS atisf y Pattern < Char >) Ġ= ĠConvert ( digit , Ġ{ it -' 0 '}, Ġ{' 0 '+ it }) Ċ Ċ val Ġdigit Ġ= Ġdigit Item ( element In (' 0 ' .. ' 9 ')) Ċ val Ġbin Digit Ġ= Ġdigit Item ( element In (' 0 ' .. ' 1 ')) Ċ fun Ġint From ( c : ĠChar ): Ġ( Char ) Ġ-> ĠInt Ġ= Ġ{ Ġit - c + 1 0 Ġ} Ċ fun Ġchar From ( c : ĠChar ): Ġ( Int ) Ġ-> ĠChar Ġ= Ġ{ Ġc +( it - 1 0 ) Ġ} Ċ Ċ val Ġhex Lower Ġ= ĠConvert ( element In (' a ' .. ' z '), Ġint From (' a '), Ġchar From (' a ')) Ċ val Ġhex Upper Ġ= ĠConvert ( element In (' A ' .. ' Z '), Ġint From (' A '), Ġchar From (' A ')) Ċ val Ġhe xD ig it Ġ= ĠDec ide ( digit , Ġhex Lower , Ġhex Upper ). merge First Ġ{ Ġif Ġ( it Ġin Ġ 0 .. 9 ) Ġ 0 Ġelse Ġ 2 Ġ} Ċ Ċ fun Ġas Int ( radix : ĠInt Ġ= Ġ 1 0 , Ġinitial : ĠInt Ġ= Ġ 0 ) Ġ= ĠJoin Fold ( initial , Ġ{ this * radix + it }) Ċ val Ġhex Part Ġ= ĠRepeat ( as Int ( 1 6 ), Ġhe xD ig it ) Ċ val Ġbin Part Ġ= ĠRepeat ( as Int ( 2 ), Ġbin Digit ) Ċ Ċ val Ġsign Ġ= ĠConvert ( element In ('+ ', Ġ'- '). to Default ('+ '), Ġ{ it ==' - '}, Ġ{ if (! it ) Ġ'+' Ġelse Ġ'- '}) Ċ // Ġ 0 x Ġ/ Ġ 0 b Ġ/ Ġ 1 2 3 Ċ val Ġzero Not ation Ġ= ĠDec ide ( ĊĠ Ġhex Part Ġprefix Ġitem (' x '), ĊĠ Ġbin Part Ġprefix Ġitem (' b '), ĊĠ ĠP eek (! digit ) Ġ{ Ġif Ġ( peek Ġ== Ġ' 0 ') Ġtake If Sticky End (- 1 ) Ġelse Ġif Ġ( it Ġ== Ġ- 3 8 /* \ n */) Ġ 0 Ġelse Ġit Ġ}. clam While ( digit , Ġ- 1 , Ġ" no Ġoct al Ġnot ations ") Ċ ). merge First Ġ{ 0 } Ċ Ċ val Ġnum Part Ġ= ĠContext ual ( digit ) Ġ{ ĊĠ Ġif Ġ( it Ġ== Ġ 0 ) Ġzero Not ation ĊĠ Ġelse ĠRepeat ( as Int ( 1 0 , Ġit ), Ġdigit ). Many () Ċ }. merge First Ġ{ 0 } Ċ Ċ val Ġint Ġ= ĠConvert ( Context ual ( sign ) Ġ{ Ġsign Ġ-> ĊĠ ĠPipe ( num Part ) Ġ{ Ġif Ġ(! sign ) Ġit Ġelse Ġ- it Ġ} Ċ }, Ġ{ Ġit . second Ġ}, Ġ{ ĠTuple 2 ( it < 0 , Ġabs ( it )) Ġ}) Ċ Ċ val Ġops Ġ= ĠKeyword Pattern < In fix Op < Int >> (). apply Ġ{ ĊĠ Ġregister ("* " Ġin fix l Ġ 0 Ġjoin ĠInt :: times ) ĊĠ Ġregister ("/ " Ġin fix l Ġ 0 Ġjoin ĠInt :: div ) ĊĠ Ġregister (" +" Ġin fix l Ġ 1 Ġjoin ĠInt :: plus ) ĊĠ Ġregister ("- " Ġin fix l Ġ 1 Ġjoin ĠInt :: minus ) Ċ } Ċ Ċ fun Ġstring For ( char : ĠS atisf y Pattern < Char >) Ġ= ĠRepeat ( asString (), Ġchar ). Many () Ċ val Ġws Ġ= Ġstring For ( element In (' Ġ', Ġ'\ t ')) Ċ val Ġatom Ġ= ĠConvert ( Seq (:: Any Tuple , Ġws , Ġint , Ġws ), Ġ{ Ġit . getAs < Int >( 1 ) Ġ}, Ġ{ Ġany Tuple Of ("", Ġit , Ġ"") Ġ}) Ċ val Ġexpr Ġ= Ġobject : ĠIn fix Pattern < Char , ĠInt >( atom , Ġops ) Ġ{ ĊĠ Ġoverride Ġfun ĠonError ( s : ĠFeed < Char >, Ġbase : ĠInt , Ġop 1 : ĠIn fix Op < Int >) Ġ= Ġ( int Ġprefix Ġitem ('\ n ')). read ( s ) Ġ?: Ġnot Parsed . also Ġ{ Ġs . error (" expect ing Ġrhs Ġfor Ġ$ base Ġ$ op 1 ") Ġ} Ċ } Ċ Ċ object ĠHex Calc Ġ{ ĊĠ Ġ@ Jvm Static Ġfun Ġmain ( var arg Ġargs : ĠString ) Ġ{ ĊĠĠĠ Ġfun Ġps 1 () Ġ{ Ġprint ("> Ġ"); ĠSystem .` out `. flush () Ġ} ĊĠĠĠ Ġps 1 () ĊĠĠĠ Ġval Ġrepl Ġ= ĠJoin By ( item ('\ n '), Ġexpr ). Add Listeners ({ Ġprintln (" = Ġ$ it "); Ġps 1 () Ġ}, Ġ{ Ġ/* on - se pr ator */ Ġ}) ĊĠĠĠ Ġval Ġcalc Logs Ġ= Ġrepl . read ( Char Input . STD IN ) ĊĠĠĠ Ġprintln ( calc Logs ) ĊĠ Ġ} Ċ } Ċ