eliana/eliana-module.scm

58 lines
1.8 KiB
Scheme

(module eliana-module
(export eliana-initialize!
make-key-container
change-key!
print-key)
(import scheme
(chicken base)
(chicken random)
(chicken keyword)
r7rs)
(define (get-random-char data-set)
(string-ref data-set
(pseudo-random-integer (string-length data-set))))
(define-syntax for
(syntax-rules (in)
((for elem in alist body ...)
(for-each (lambda (elem) body ...) alist))))
(define-syntax range
(syntax-rules (from to)
((range from n to m)
(let loop ((ret '())
(i n))
(cond ((> i m) (reverse ret))
(else (loop (cons i ret)
(add1 i))))))))
(define (change-entire-key! key-container data-set)
(for n in (range from 0 to (sub1 (string-length key-container)))
(string-set! key-container n (get-random-char data-set))))
(define (change-key-character-at-a-time! key-container data-set)
(string-set! key-container
(pseudo-random-integer (string-length key-container))
(get-random-char data-set)))
(define (change-key! key-container data-set #!optional change-entire-key?)
(if change-entire-key?
(change-entire-key! key-container data-set)
(change-key-character-at-a-time! key-container data-set)))
(define (print-key key-container . args)
(let ((prefix (get-keyword #:prefix args))
(postfix (get-keyword #:postfix args)))
(when prefix (display prefix))
(display key-container)
(when postfix (display postfix))
(newline)))
(define (make-key-container key-length)
(make-string key-length #\0))
(define (eliana-initialize! seed)
(set-pseudo-random-seed! seed)))