blob: 2e5f2b44f316e4fb91f7bd9cc1a88a858c8c01e2 (
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
|
(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))))))
|