wisp
 
(Arne Babenhauserheide)
2016-04-06: implement safe password generator.

implement safe password generator.

diff --git a/examples/safepassword.w b/examples/safepassword.w
--- a/examples/safepassword.w
+++ b/examples/safepassword.w
@@ -8,5 +8,48 @@ exec guile -L $(dirname $(dirname $(real
 define-module : examples safepassword
               . #:export : password
 
+import
+    only (srfi srfi-27) random-source-make-integers
+      . make-random-source random-source-randomize!
+    only (srfi srfi-1) second
+
+define random-source : make-random-source
+random-source-randomize! random-source
+
+define random-integer 
+       random-source-make-integers random-source
+
+define : randomletter letters
+      string-ref letters
+        random-integer
+          string-length letters
+
+define : password length
+      let
+       : quertysafeletters "0123456789ABCDEFGHJKLMNPQRSTUVWXabcdefghijkmnopqrstuvwx"
+         ;; that’s newbase60 without yz_
+         ;; means 5.78 bits entropy per letter.
+         delimiters ",.!?-+"
+         ;; that’s 2.5 bits entropy per delimiter
+       let fill
+         : letters '()
+           remaining length
+         if : zero? remaining
+            reverse-list->string letters
+            fill
+              cons : randomletter quertysafeletters
+                if : and (not (= length remaining)) : zero? : modulo remaining 4
+                   cons : randomletter delimiters
+                        . letters
+                   . letters
+              - remaining 1
+
 define : main args
-       display "password\n"
+      let
+       :
+         len
+           if : = 2 : length args
+              string->number : second args
+              . 16
+       display : password len
+       newline