examples/story.lisp @ ddcf7ddf78f6

Interpreter -> compiler
author Steve Losh <steve@stevelosh.com>
date Wed, 18 Jan 2017 18:04:41 +0000
parents 9a223fdf9928
children (none)
(in-package :chancery)
(named-readtables:in-readtable :chancery)

(defun pronoun (gender)
  (case gender
    (:female "she")
    (:male "he")
    (:neuter "it")
    (t "they")))

(defun posessive-pronoun (gender)
  (case gender
    (:female "her")
    (:male "his")
    (:neuter "its")
    (t "their")))


(defparameter *name* nil)
(defparameter *pronoun* nil)
(defparameter *possessive* nil)

(define-rule hero
  (list "freyja" :female)
  (list "loki" :male)
  (list "time" :neuter)
  (list "frobboz" :frobbian))

(define-rule weapon
  "axe" "sword" "banana")

(define-rule animal
  "mouse" "squirrel" "beaver" "antelope" "rabbit" "elk")

(define-rule monster
  "dragon" "kraken" "chimera")

(define-rule story%
  ([*name* cap] "took up" *possessive* "mighty" weapon "and went forth."
   [*pronoun* cap] "slew the" monster "and the people rejoiced.")
  ("Once upon a time there was" [animal a] "named" [*name* cap] :. "."
   [*pronoun* cap] "went to the village and was very happy."))

(defun story ()
  (destructuring-bind (name gender) (hero)
    (let ((*name* name)
          (*pronoun* (pronoun gender))
          (*possessive* (posessive-pronoun gender)))
      (story%))))