-
Notifications
You must be signed in to change notification settings - Fork 0
/
quiz.lisp
56 lines (50 loc) · 2.18 KB
/
quiz.lisp
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
(in-package :language)
(defparameter *quiz-dictionary* "sokrat_ru-en")
(defun print-quiz-definition (word)
(let ((translation (format nil "~A" (car (translate word :source "ru" :target "en")))))
(princ translation)
(iter
(for (dictionary first rest) in (define-word word))
(when (equal dictionary *quiz-dictionary*)
(if (string-starts-with rest " см. также")
(print-quiz-definition (subseq rest 12))
(let ((definition (string-trim '(#\space #\newline) rest)))
(when (not (equal definition translation))
(format t ";~A" definition))))
(return))))
(fresh-line))
(defun say-quiz-word (word)
(let ((audio-mapping (frequency-wordlist-audio-mapping)))
(when-let (audio (gethash word audio-mapping))
(iter (for (part-of-speech . voices) in audio)
(format t "~A" part-of-speech)
(force-output)
(iter (for (spelling . sound-name) in voices)
(format t " ~A" spelling)
(force-output)
(play (shtooka-word-from-full-name sound-name)))
(fresh-line)))))
(defun cache-all-frequency-wordlist-audio ()
(iter (for (k v) in-hashtable (frequency-wordlist-audio-mapping))
(iter (for (pos . voices) in v)
(iter (for (spelling . sound-name) in voices)
(format t "~A " spelling)
(shtooka-word-from-full-name sound-name))
(fresh-line))))
(defun cache-all-wordlist-translations ()
(iter (for (word pos) in *word-frequency-list*)
(format t "~A " word)
(force-output)
(format t "~A~%" (car (translate word :source "ru" :target "en")))))
(defun quiz (&optional maximum-word-length strict-word-length)
"Simple quiz of typing, understanding and pronouncing Russian words."
(format t "Type 'q' to exit.~%")
(multiple-value-bind (words length)
(list-frequency-words maximum-word-length strict-word-length)
(iter
(let ((word (nth (random length) words)))
(format t "~%• ~A~&" word)
(let ((input (read-line)))
(when (equal input "q") (return)))
(print-quiz-definition word)
(say-quiz-word word)))))