native alen native aget native aput native anew native _array func __array { "NotImplemented" "Not implemented" throw } native _char native _int native _file native _float native _long native _double func __char { _char } func __int { _int } func __file { _file } native __float func __long { _long } native __double native ischar native isint native isfloat native islong native isdouble native include native putchar native read native flength native write native type native mktype # "call a dynamically computed function" pop native call native typename native istype native settype # "try and catch are keywords, not functions" pop native throw native exit # "storelength" pop native stlen native eq native gt native lt native not native or native and native + native - native / native * native ** native % native ^ native dup native pop native swap func ++ { 1 + } func -- { 1 - } # "this looks so wrong" pop func ( { } func ) { } func # { } "char" mktype =TYPE_CHAR "int" mktype =TYPE_INT "file" mktype =TYPE_FILE "float" mktype =TYPE_FLOAT "long" mktype =TYPE_LONG "double" mktype =TYPE_DOUBLE "array" mktype =TYPE_ARRAY "string" mktype =TYPE_STRING func _string { =object object ischar if { 0 _char 1 anew =object } object isint if { itos =object } object isfloat if { ftoi =object } object islong if { ltoi =object } object isdouble if { dtoi =object } object } func __string { _string } func isstring { isarray } func itos { ntos } func ltos { ntos } func ftos { ntos } func dtos { ntos } # "Number to string" pop func ntos { "" =s =n n 0 lt dup if { n neg =n 1 =negative } =negative n type =thetype while { n 1 lt not } { n ( n 10 % dup =x ) - =n s ( n '0' + _char ) strconcat =s } 1 =steps while { n 0 eq not } { n ( n ( 1 ( steps dup 10 * =steps ) / ) % dup =x ) - =n s ( x '0' + _char ) strconcat =s } s } # "Copy array" pop func acopy { # "bind args" pop =len =idx2 =idx1 =arr2 =arr1 1 neg =i while { ( i 1 + =i ) ( i len lt ) } { arr2 i idx2 + ( arr1 i idx1 + aget ) aput } } func strconcat { # "bind args" pop _string =str2 _string =str1 0 _char str1 alen str2 alen + anew =str str1 str 0 0 str1 alen acopy str2 str 0 str1 alen str2 alen acopy str } func strsplit { # "bind args" pop _string =splitter _string =str 1 neg =i "" 0 anew =sequences "" =sequence while { ( i 1 + =i ) ( i str alen lt ) } { str i aget =chr splitter 0 aget =spl sequence chr strconcat =sequence 1 neg =j while { ( j 1 + =j ) ( chr spl eq ) } { j splitter alen eq if { sequences =oldsq "" ( sequences alen dup =seq 1 + ) anew =sequences oldsq sequences 0 0 oldsq alen acopy sequences seq sequence aput "" =sequence 2 stop } str i j + aget dup =chr splitter j aget dup =spl } } sequences } func strjoin { # "bind args" pop _string =joiner _array =arr 1 neg =i "" =s while { ( i 1 + =i ) ( i arr alen lt ) } { s arr i aget joiner strconcat strconcat =s } s } func strsub { # "bind args" pop _int =pos2 _int =pos1 _string =string pos2 pos1 - =length ( o _char length anew dup ) string swap pos1 0 length acopy } func puts { _string =str 1 neg =i while { ( i 1 + =i ) ( i str alen lt ) } { str i aget putchar } }