58 lines
1.8 KiB
Scheme
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)))
|