aboutsummaryrefslogtreecommitdiffstats
path: root/toplevel.scm
blob: d5d6cd0e105bd5b619329d2d973f14f7c7d3b909 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
(load "markov.chicken.so")
(import markov
        (chicken format)
        srfi-18
        srfi-69
        (chicken file))

(define table
  (if (file-exists? "kjv-data.scm")
      (with-input-from-file "kjv-data.scm"
        (lambda ()
          (display "Reading previously generated data.\n" (current-error-port))
          (alist->hash-table (read))))
      (with-output-to-file "kjv-data.scm"
        (lambda ()
          (display "Generating table (this may take a while)\n" (current-error-port))
          (let ((table (make-table-from-file "kjv.txt")))
            (display "done generating.\n" (current-error-port))
            (write (hash-table->alist table))
            table)))))

(define (generate-until-word* current collected limits)
  (if (member current limits)
      (reverse collected)
      (generate-until-word* (generate-next-word table current)
                            (cons current collected)
                            limits)))

(define (generate-until-word limits)
  (generate-until-word* (generate-next-word table (car limits))
                        '()
                        limits))


(define (make-a-bible-verse)
  (generate-until-word '("startofverse" "startofchapter" "startofbook")))

(define (make-a-book-of-the-bible)
  (generate-until-word '("startofbook")))

(define (display-a-book-of-the-bible)
  (display (join-verses (make-a-book-of-the-bible))))

(define (generate-continuously* previous-word time book chapter verse)
  ;; For some reason, default CHICKEN only allows sleeping in increments
  ;; of 1 second, but THREAD-SLEEP! in SRFI-18 allows for millisecond
  ;; precision.
  (flush-output)
  (thread-sleep! time)
  (cond
    ((equal? previous-word "startofbook")
     (let ((next-word (generate-next-word table "of")))
       (if (equal? next-word "the")
           (set! next-word (generate-next-word table "the")))
       (printf "THE BOOK OF ~A~%~%~%" next-word)
       (printf "~A:1:1" (+ book 1))
       (generate-continuously* (generate-next-word table "startofverse")
                               time (+ 1 book) 1 1)))
    ((equal? previous-word "startofchapter")
     (printf "~%~%~A:~A:1" book (+ 1 chapter))
     (generate-continuously* (generate-next-word table "startofverse")
                             time book (+ 1 chapter) 1))
    ((equal? previous-word "startofverse")
     (printf "~%~A:~A:~A" book chapter (+ 1 verse))
     (generate-continuously* (generate-next-word table previous-word)
                             time book chapter (+ 1 verse)))
    (else (let ((first-char (string-ref previous-word 0)))
            (if (or (char-alphabetic? first-char)
                    (char-numeric? first-char))
                (printf " ~A" previous-word)
                (printf "~A" previous-word))
            (generate-continuously* (generate-next-word table previous-word)
                                    time book chapter verse)))))

(define (generate-continuously time)
  (generate-continuously* "startofbook" time 0 1 1))

(display "Seeding from truly random source...\n")
(seed-from-entropy)
(display "Try (make-a-bible-verse), (display-a-book-of-the-bible), and (generate-continuously 0.1).\n")