#!/usr/bin/env -S guile -e "main" -s !# ;; -*- geiser-scheme-implementation: guile -*- (import (srfi srfi-1) (ice-9 rdelim) (ice-9 format)) (define* (read-lines #:optional (port (current-input-port))) (unfold eof-object? values (lambda (_) (read-line)) (read-line))) (define (random-lines file count) (let* ((lines (with-input-from-file file read-lines)) (length (length lines))) (map (lambda (_) (list-ref lines (random length))) (iota count)))) (define (random-phrase file words-count) (let* ((words (random-lines file words-count))) (string-concatenate (map (lambda (w) (string-append w " ")) (append `(,(string-capitalize (first words))) (map (lambda (word) (case (random 10) ((0) (string-append word ",")) ((1) (string-append word " -")) ((1) (string-append word ":")) (else word))) (reverse (cdr (reverse (cdr words))))) `(,(string-append (last words) (case (random 5) ((0) "!") ((1) "?") ((2) "...") (else "."))))))))) (define (main args) (if (null? (cdr args)) (format #t "Usage: ~a \n" (car args)) (let ((WORDS-FILE (cadr args))) (set! *random-state* (random-state-from-platform)) (display (string-upcase (random-phrase WORDS-FILE (+ 3 (random 4))))) (newline))))