master chld/dot / bin / gark
 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  )