diff options
Diffstat (limited to 'soru.lisp')
-rw-r--r-- | soru.lisp | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/soru.lisp b/soru.lisp new file mode 100644 index 0000000..2e5f2b4 --- /dev/null +++ b/soru.lisp @@ -0,0 +1,101 @@ +(in-package :japonca) + +(setf *random-state* (make-random-state t)) + +(defparameter *kelimeler* nil) +(defparameter *kelimeler-dosyası* "/home/riton/projects/japonca/kelimeler.txt") + +(defun kelimeleri-yükle (&optional (dosya *kelimeler-dosyası*)) + (setf *kelimeler* + (okurla (okur dosya) + (metni-yükle okur) + (işle okur)))) + +(defun kullanıcı-cevap () + (let ((cevap (string-left-trim '(#\Space) (read-line)))) + (cond ((string= "" cevap) :çık) + ((string= "?" cevap) :kopya) + ((char= #\: (char cevap 0)) (read-from-string cevap)) + (t cevap)))) + +(defparameter *soru-sayısı* nil) + +(defmethod kelime-soru :before (kelime tip) + (when *soru-sayısı* + (format t "~a. " *soru-sayısı*))) + +(defmethod kelime-soru ((kelime kelime) (tip (eql :okunuş)) ) + (block soru + (let (cevap sonuç) + (format t "~a nasıl okunur ? " (kanji kelime)) + (setf sonuç (loop :do (case (setf cevap (kullanıcı-cevap)) + (:çık (return-from soru :çık)) + (:kopya (format t "anlam: ~{~a~^, ~} : " (anlam kelime))) + (t (return (kana= kelime cevap)))))) + (when (not sonuç) + (format t "yanlış. ~{~a~^、~} olmalı~%" (kana kelime))) + sonuç))) + +(defgeneric alıştırma (tip &key &allow-other-keys)) + +(defmethod alıştırma :before ((tip (eql :okunuş)) &key (baş 0) son &allow-other-keys) + (when (null *kelimeler*) + (kelimeleri-yükle)) + (format t "Tanımlı kelimeler: ~d~%" (fill-pointer *kelimeler*)) + (when (not son) + (setf son (length *kelimeler*))) + (format t "Aralık: ~d-~d, ~d kelime~%" baş (- son 1) (- son baş))) + +(defmethod alıştırma ((tip (eql :okunuş)) &key (baş 0) son &allow-other-keys) + (let ((yanlış 0) (doğru 0)) + (loop :for *soru-sayısı* :from 1 + :for cevap := (kelime-soru (rastgele-kelime *kelimeler* :test #'kanji + :baş baş :son son) + :okunuş) + :do (cond ((eq :çık cevap) + (format t "~d/~d~%" doğru (+ doğru yanlış)) + (loop-finish)) + ((not cevap) (incf yanlış)) + (t (incf doğru)))))) + +;; (defmacro soru-tanım (args &body beden) +;; `(block soru +;; (let (cevap sonuç) +;; (format t "~a nasıl okunur ? " (kanji kelime)) +;; (setf sonuç +;; (loop :do (case (setf cevap (kullanıcı-cevap)) +;; (:çık (return-from soru)) +;; (:kopya (format t "anlam: ~{~a~^, ~} : " (anlam kelime))) +;; (t (return (kana= kelime cevap)))))) +;; (when (not sonuç) +;; (format t "yanlış. ~{~a~^、~} olmalı~%" (kana kelime)))))) +;; (soru-tanım (kelime :okunuş) +;; ;; (:doğru-cevap (kana kelime)) +;; (:soru "~a nasıl okunur ?" (kanji kelime)) +;; (:cevap +;; (:kopya (format t "anlamı : ~a" (anlam kelime)) +;; (setf cevap (kullanıcı-cevap)))) +;; (:d "doğru.~%") +;; (:y "yanlış, doğrusu ~s.~%" (kana kelime))) + +;; (defmethod cevap-kontrol ((kelime kelime) cevap fn)) +;; (defmacro cevapla ) + +;; (defmethod kelime-soru ((kelime kelime) (tip (eql :okunuş))) +;; (block soru +;; (labels ((cevapla () +;; (let ((cevap (kullanıcı-cevap))) +;; (case cevap +;; (:çık (return)) +;; (:kopya (format t "anlam: ~{~a~^, ~} : " (anlam kelime)) +;; (cevapla)) +;; (t (kana= kelime cevap)))))) +;; (format t "~a. ~a nasıl okunur ? " *soru-sayısı* (kanji kelime)) +;; (loop :for cevap := (kullanıcı-cevap) +;; :do (case cevap +;; (:çık (return-from soru)) +;; (:kopya (format t "anlam: ~{~a~^, ~} : " (anlam kelime))) +;; (t (return (kana= kelime cevap))))) +;; (if (cevapla) +;; (format t "doğru.~%") +;; (format t "yanlış. ~{~a~^、~} olmalı~%" (kana kelime)))))) |