summaryrefslogtreecommitdiff
path: root/soru.lisp
blob: 4b02b32bea00148e158c0180e20c1ba5291da8c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
(in-package :japonca)

(setf *random-state* (make-random-state t))

(defparameter *kelimeler* nil)
(defparameter *kelimeler-dosyası*
  (format nil "/home/~a/projects/japonca/kelime/kelimeler.txt"
          (uiop:hostname)))

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