-
Notifications
You must be signed in to change notification settings - Fork 0
/
keyboard.lisp
40 lines (37 loc) · 1.37 KB
/
keyboard.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
(in-package :language)
(defparameter *russian-characters*
'("фывапролджэ"
"йцукенгшщзхъ"
"ячсмитьбю"))
(defun quiz-keys (&key (line '(0 1 2)) (shuffle #'shuffle))
"Simple quiz of the Russian keyboard."
(format t "Press 'q' to exit.~%")
(let ((line
(etypecase line
(number (nth line *russian-characters*))
(cons (with-output-to-string (stream)
(iter (for index in line)
(write-string (nth index *russian-characters*) stream)))))))
(let (remaining)
(iter
(when (null remaining)
(setf remaining (funcall (or shuffle #'identity) (coerce line 'list))))
(for char = (pop remaining))
(format t "~A~%" char)
(let ((in (read-char-from-emacs)))
(if (char= in #\q)
(return)
(unless (char= in char)
(format t "WRONG! (~A)~%" in))))))))
(defun quiz-typing (&optional maximum-word-length)
"Simple quiz of typing Russian words."
(format t "Type 'q' to exit.~%")
(multiple-value-bind (words length)
(list-frequency-words maximum-word-length)
(iter
(let ((word (nth (random length) words)))
(format t "~A~&" word)
(let ((input (read-line)))
(when (equal input "q") (return))
(when (not (equal input word))
(format t "WRONG!~%")))))))