Zvire-0.05.el
Vzhled
zvire.el je program pro demonstraci:
- učících se programů
- implemantace struktury binárního rozhodovacího stromu
- programování v lispu, konkrétně v jeho klonu elisp, použité v editoru emacs
;-*-Lisp-*-
; Copyleft Kychot 1997
; Zvire
; =====
; Verse 0.05 - funkce sel3... / set3...
(setq zverinec1 '("chlupaté" ("domácí" "kočka" . "tygr") . "ryba"))
(setq zverinec2 '
("chlupaté" ("domácí" ("věrné" "pes" "víc chlupaté" "ovečka" "rohaté" ("více dojivé" "kravička" . "koza") . "kočka") "s velkýma ušima" "medvěd" . "tygr") "slizské" ("dlouhé" "had" "červené" "beruška" . "žába") "pernaté" "slepice" . "ryba")
)
(setq zver-file "zverinec")
(defun zvire ()
"Hra na hádání zvířat."
(interactive)
(let ((zver-file "zverinec") (zver-buffer))
(if (file-readable-p zver-file)
(progn
(setq zver-buffer (find-file-noselect zver-file))
(save-excursion
(set-buffer zver-buffer)
(goto-char (point-min))
)
(setq zverinec (read zver-buffer))
)
(progn
(setq zver-buffer (find-file-noselect zver-file))
(setq zverinec '("chlupaté" "kočka" . "ryba"))
)
)
(while (and (y-or-n-p "Myslíš si nějaké zvíře? ") (hadej zverinec)))
(if (y-or-n-p
"Tak si do příště nejaké vymysli. Mám uložit zvířata do zvěřince? ")
(save-excursion
(print zverinec zver-buffer)
(set-buffer zver-buffer)
(save-buffer)
) )
; (kill-buffer zver-buffer)
) )
(defun sel3-1 (list)
"Vybere prvni prvek trojice."
(car list))
(defun sel3-2 (list)
"Vybere druhy prvek trojice."
(car (cdr list)))
(defun sel3-3 (list)
"Vybere treti prvek trojice."
(cdr (cdr list)))
(defun set3-1 (cell3 new)
"Nahradi prvni prvek trojice."
(setcar cell3 new))
(defun set3-2 (cell3 new)
"Nahradi druhy prvek trojice."
(setcar (cdr cell3) new))
(defun set3-3 (cell3 new)
"Nahradi treti prvek trojice."
(setcdr (cdr cell3) new))
(defun hadej (zvirata)
"Hada podle seznamu zvirata."
(let ((vlastnost (sel3-1 zvirata))
(prvni-druha)
(vybrany)
(nove-zvire)
(nova-vlastnost)
)
(setq prvni-druha (zeptej-se vlastnost))
(setq vybrany (if prvni-druha (sel3-2 zvirata)(sel3-3 zvirata)))
(if (consp vybrany)
(hadej vybrany) ; rekurse
(if (odpovez vybrany) ; konec rekurse - pokrac.?
(y-or-n-p "Hurá, uhádnul jsem. Budeme hádat další zvíře? ")
(progn ; nove zvire do seznamu
(setq nove-zvire (read-string
"Jiné takové zvíře neznám. Jak se jmenuje? "))
(setq nova-vlastnost (read-string (format
"A jaké je %s zvíře na rozdíl od zvířete zvaného %s? "
nove-zvire vybrany)))
(if (y-or-n-p (format
"Platí, že %s je zvíře %s a %s není zvíře %s? "
nove-zvire nova-vlastnost vybrany nova-vlastnost))
(if prvni-druha
(setcar takovi-onaci
(cons nova-vlastnost (cons nove-zvire vybrany)))
(setcdr takovi-onaci
(cons nova-vlastnost (cons nove-zvire vybrany)))
) )
(y-or-n-p "Děkuji za poučení. Mám zase hádat? ")
) ) ) ) )
; (hadej zverinec1)
; (zeptej-se 'šedivé)
(defun zeptej-se (vlastnost)
"Zepta se na vlastnost zvirete."
(y-or-n-p (format "Je to zvíře %s? " vlastnost)))
; (odpovez 'myš)
(defun odpovez (zvire)
"Odpovi uhadnute zvire."
(y-or-n-p (format "Je to %s! Že mám pravdu? " zvire)))
(defun a-or-n-p (otazka)
"Jako y-or-n-p ale cesky a/n"
(let ((odpoved))
(setq odpoved (read-string (format "%s(a/n)" otazka)))
(if (eq odpoved 'a) 't
(if (eq odpoved 'n) nil
(a-or-n-p otazka)))))
; (a-or-n-p 'zkouška)