(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."))))
))