(Arne Babenhauserheide)
2015-06-22: add newbase60 example with integer->sxg add newbase60 example with integer->sxg
diff --git a/examples/newbase60.w b/examples/newbase60.w --- a/examples/newbase60.w +++ b/examples/newbase60.w @@ -2,8 +2,39 @@ exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples newbase60) main)' -s "$0" "$@" ; !# +;; Encoding and decoding numbers in New Base 60 as defined by Tantek: +;; http://tantek.pbworks.com/NewBase60 + +;; Based on the very elegant implementation from kevin marks: +;; https://github.com/indieweb/newBase60py/blob/master/newbase60.py + define-module : examples newbase60 . #:export : main + . #:use-module : srfi srfi-1 + +define base60letters "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ_abcdefghijkmnopqrstuvwxyz" +define base60numbers + append + map cons (string->list base60letters) : iota : string-length base60letters + quote + : + #\l . 1 ; typo lowercase l to 1 + #\I . 1 ; typo capital I to 1 + #\O . 0 ; typo capital O to 0 + +define : integer->sxg num + if : equal? 0 num + . "0" + let loop + : s '() + n num + if : equal? n 0 + list->string : reverse s + loop + cons + string-ref base60letters (remainder n 60) + . s + quotient n 60 define : main args - display args + display : integer->sxg 61