#!./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