fork(2) download
  1. ; scrambled words
  2.  
  3. (use numbers)
  4.  
  5. (define rand ; knuth random number generator with shuffle box
  6. (let* ((a 69069) (c 1234567) (m 4294967296) (k 32) ; 32-bit
  7. ; (a 6364136223846793005) (c 1442695040888963407)
  8. ; (m 18446744073709551616) (k 256) ; 64-bit
  9. (seed 19380110) ; happy birthday knuth
  10. (next (lambda ()
  11. (set! seed (modulo (+ (* a seed) c) m)) seed))
  12. (init (lambda (seed) (let ((box (make-vector k)))
  13. (do ((j 0 (+ j 1))) ((= j k) box)
  14. (vector-set! box j (next))))))
  15. (box (init seed)))
  16. (lambda args
  17. (if (pair? args)
  18. (set! seed (modulo (car args) m)) (set! box (init seed)))
  19. (let* ((j (quotient (* k seed) m)) (n (vector-ref box j)))
  20. (set! seed (next)) (vector-set! box j seed) (/ n m)))))
  21.  
  22. (define (randint . args)
  23. (let ((lo (if (pair? (cdr args)) (car args) 0))
  24. (hi (if (pair? (cdr args)) (cadr args) (car args))))
  25. (+ lo (floor (* (rand) (- hi lo))))))
  26.  
  27. (define (shuffle x)
  28. (do ((v (list->vector x)) (n (length x) (- n 1)))
  29. ((zero? n) (vector->list v))
  30. (let* ((r (randint n)) (t (vector-ref v r)))
  31. (vector-set! v r (vector-ref v (- n 1)))
  32. (vector-set! v (- n 1) t))))
  33.  
  34. (define (scramble str)
  35. (let* ((cs (string->list str))
  36. (upper (map char-upper-case? cs))
  37. (cs (map char-downcase cs)))
  38. (let loop ((cs cs) (word (list)) (zs (list)))
  39. (cond ((null? cs) ; end of input
  40. (list->string
  41. (map (lambda (u? c)
  42. (if u? (char-upcase c) c))
  43. upper (reverse zs))))
  44. ((char-alphabetic? (car cs)) ; in a word
  45. (loop (cdr cs) (cons (car cs) word) zs))
  46. ((pair? word) ; end of word
  47. (loop cs (list) (append (shuffle word) zs)))
  48. (else ; not in a word
  49. (loop (cdr cs) word (cons (car cs) zs)))))))
  50.  
  51. (display (scramble "Programming Praxis is fun!")) (newline)
  52. (display (scramble "Programming Praxis is fun!")) (newline)
  53. (display (scramble "Programming Praxis is fun!")) (newline)
Runtime error #stdin #stdout #stderr 0s 7720KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Error: (import) during expansion of (import ...) - cannot import from undefined module: numbers

	Call history:

	<syntax>	  (use numbers)
	<syntax>	  (##core#require-extension (numbers) #t)
	<syntax>	  (##core#begin (##core#begin (##sys#require (quote numbers)) (import numbers)) (##core#undefined))
	<syntax>	  (##core#begin (##sys#require (quote numbers)) (import numbers))
	<syntax>	  (##sys#require (quote numbers))
	<syntax>	  (quote numbers)
	<syntax>	  (##core#quote numbers)
	<syntax>	  (import numbers)	<--