(Arne Babenhauserheide)
2015-06-22: newbase60: works with negative numbers, too. newbase60: works with negative numbers, too.
diff --git a/examples/newbase60.w b/examples/newbase60.w --- a/examples/newbase60.w +++ b/examples/newbase60.w @@ -22,30 +22,44 @@ define base60numbers #\I . 1 ; typo capital I to 1 #\O . 0 ; typo capital O to 0 -define : integer->sxg num +define : positive-integer->sxg num . "Convert a positive integer to Tanteks new base 60." if : equal? 0 num . "0" let loop - : s '() - n num - if : equal? n 0 - list->string s - loop - cons (string-ref base60letters (remainder n 60)) s - quotient n 60 + : s '() + n num + if : equal? n 0 + list->string s + loop + cons (string-ref base60letters (remainder n 60)) s + quotient n 60 -define : sxg->integer string - . "Convert a new base 60 string into a positive integer." +define : positive-sxg->integer string + . "Convert a positive new base 60 string into a positive integer." let loop : n 0 s string - if : equal? "" s - . n - loop - + : assoc-ref base60numbers : string-ref s 0 - * n 60 - string-drop s 1 + cond + : equal? "" s + . n + else + loop + + : assoc-ref base60numbers : string-ref s 0 + * n 60 + string-drop s 1 + +define : integer->sxg num + . "Convert an integer to Tanteks new base 60." + if : >= num 0 + positive-integer->sxg num + string-append "-" : positive-integer->sxg : - num + +define : sxg->integer str + . "Convert a new base 60 string into an integer." + if : and (>= (string-length str) 1) (equal? #\- (string-ref str 0)) + - : positive-sxg->integer : string-drop str 1 + positive-sxg->integer str define : date->sxg year month day hour minute second . "Convert a date into new base 60 format: @@ -65,20 +79,23 @@ define : sxg->date str " let* : centeridx : string-rindex str #\- ; rindex because the year could be negative + getstr : lambda (s di) : string : string-ref str : + centeridx di year : substring/read-only str 0 : - centeridx 2 - month : string : string-ref str : - centeridx 2 - day : string : string-ref str : - centeridx 1 - hour : string : string-ref str : + centeridx 1 - minute : string : string-ref str : + centeridx 2 - second : string : string-ref str : + centeridx 3 + month : getstr str -2 + day : getstr str -1 + hour : getstr str 1 + minute : getstr str 2 + second : getstr str 3 map sxg->integer list year month day hour minute second define : main args + let + : help : lambda () : format #t "usage: ~A [integer | -d string | --datetime | --datetime year month day hour minute second | --help]\n" : list-ref args 0 cond : or (= 1 (length args)) (member "--help" args) - format #t "usage: ~A [integer | -d string | --datetime | --datetime year month day hour minute second | --help]\n" : list-ref args 0 - : and (= 7 (length args)) : equal? "--datetime" : list-ref args 1 + help + : and (= 8 (length args)) : equal? "--datetime" : list-ref args 1 format #t "~A\n" : apply date->sxg : map string->number : drop args 2 : and (= 2 (length args)) : equal? "--datetime" : list-ref args 1 let : : tm : localtime : current-time @@ -89,4 +106,5 @@ define : main args format #t "~A\n" : sxg->integer : list-ref args 2 : = 2 : length args format #t "~A\n" : integer->sxg : string->number : list-ref args 1 - + else + help