(defstruct kysymys teksti kyllä ei)

(defvar *kysymykset*
  (make-kysymys :teksti 'eläin
                :kyllä nil
                :ei (make-kysymys :teksti 'kasvi
                                  :kyllä nil
                                  :ei nil)))

(defun lisää-tietämystä ()
  "Lisää joko kyllä- tai ei-haaraan uuden kysymyksen."
  (princ "Annan periksi, mikä se on?")
  (make-kysymys :teksti (read) :kyllä nil :ei nil))

(defun kysy ()
  (let ((kysymys *kysymykset*)
        (vastaus nil)
        (seuraava nil))
    (loop
     (format t "~%Onko se ~a? " (kysymys-teksti kysymys))
     (setf vastaus (read))
     (cond
      ((eq vastaus 'kyllä)
       (setf seuraava (kysymys-kyllä kysymys))
       (when (null seuraava)
         (setf (kysymys-kyllä kysymys) (lisää-tietämystä))
         (return))
       (setf kysymys seuraava))
      ((eq vastaus 'ei)
       (setf seuraava (kysymys-ei kysymys))
       (when (null seuraava)
         (setf (kysymys-ei kysymys) (lisää-tietämystä))
         (return))
       (setf kysymys seuraava))
      ((eq vastaus 'oikein) (return 'yesh))
      (t (princ "Vastaa joko kyllä, ei tai oikein."))))
    ))