1#!/bin/guile
2!#
3(use-modules (ice-9 hash-table)
4 (ice-9 rdelim)
5 (srfi srfi-1)
6 (srfi srfi-13))
7
8(set! *random-state* (random-state-from-platform))
9
10(define c (make-hash-table))
11(define (learn l)
12 (let k (
13 (w (string-split l #\space))
14 )
15 (when (>= (length w) 3)
16 (hash-set! c (string-append (car w) " " (cadr w))
17 (cons (caddr w) (hash-ref c (string-append (car w) " " (cadr w)) '())
18 ))
19 (k (cdr w))
20 )
21 ))
22
23(call-with-input-file (cadr (command-line))
24 (lambda (p) (let r ()
25 (let ((l (read-line p))) (unless (eof-object? l)(learn l)
26 (r))))
27 )
28 )
29
30(define (say)
31 (let*
32 (
33 (k (hash-map->list (lambda (k v) k) c))
34 (s (list-ref k (random (length k))))
35 (w (string-split s #\space))
36 )
37 (let sy (
38 (p w)
39 (r w)
40 (n 0)
41 )
42 (if (> n (random 100))
43 (string-join r " ")
44 (let (
45 (C (hash-ref c (string-join p " ") #f))
46 )
47 (if (not C)
48 (string-join r " ")
49 (let (
50 (N (list-ref C (random (length C))))
51 )
52 (sy (list (cadr p) N)
53 (append r (list N))
54 (1+ n))
55 )
56 )
57 )
58 )
59 )
60 )
61 )
62
63(define r (random 100))
64(let main (
65 (i 0)
66 )
67 (when (not (= i r))
68 (format #t "~a~%" (say))
69 (main (+ i 1))
70 )
71 )