#!./wisp-multiline.sh
; !#
define base60chars
. "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ_abcdefghijkmnopqrstuvwxyz"
define : base60encode number
let moddown : (base60 "") (quotient number)
if : < quotient 60
string-append (substring base60chars quotient (+ 1 quotient)) base60
let : : remainder : floor-remainder quotient 60
moddown
string-append
substring base60chars remainder : + 1 remainder
. base60
floor-quotient quotient 60
define : base60decode string
let decode : (number 0) (rest string)
if : = 1 : string-length rest
+ (* number 60) : string-index base60chars : string-ref rest 0
decode
+ (* number 60) : string-index base60chars : string-ref rest 0
string-drop rest 1
define testnumbers
let
: start : list 0 1 10 60 59 61 100 1000 1e4 1e5 1e6 1e7 1e8 1e9 64 128
multiplesof256 1000
let loop : (numbers start) (exponent 1)
if : > exponent multiplesof256
. numbers
loop
append numbers : list : expt 256 exponent
+ 1 exponent
define : displaywithnewline foo
display foo
newline
; map displaywithnewline
; map base60encode
; map inexact->exact testnumbers
; map displaywithnewline
; map base60decode
; map base60encode
; map inexact->exact testnumbers
displaywithnewline
base60encode : list-ref testnumbers : - (length testnumbers) 1