summaryrefslogtreecommitdiff
path: root/soru.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'soru.lisp')
-rw-r--r--soru.lisp101
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))))))