Saturday, March 11, 2006
Generative text in guile
I'm amazed at how quickly I was able to cobble up a generative text program in Lisp. Well, Scheme. Technically guile, the GNU version of Scheme. I didn't bother with parsing the existing datafiles—instead I did the “arrays of strings and a slew of code (actually, very little) to sling the pieces together, but it was darned near trivial. The entire program, sans array declarations, comes down to:
(define rndstate 0)
(define refn array-ref) ;; return an element from an array
(define (main args)
(set! rndstate (seed->random-state (current-time)))
(display (racter))
(display "\n\n")
(exit 0)
)
;; return the size of an array
(define (nref a) (car (array-dimensions a)))
;; return a random element from an array
(define (ref a) (array-ref a (random (nref a) rndstate)))
;; sling those strings
(define (racter)
(eval (cons 'string-append (array->list (ref default-template)))
(interaction-environment)
)
)
The code itself is mostly array declarations (and this particular bit of code is a translation from Games Ataris Play—hey, it was a couple of bucks from a used book store) with this bit of code at the bottom.
There are some features I want to add to this, but they shouldn't take
all that much code. Once I get this working how I want it, it should be
pretty straightforward to convert the existing datafiles I have into
LispSchemeguile.
![Glasses. Titanium, not steel. [Self-portrait with my new glasses]](https://www.conman.org/people/spc/about/2025/0925.t.jpg)