;; Словарь окончаний: последние 3 буквы -> номер семантического эквивалента (defparameter *dict* '(("ами" . 1) ; существительные творительный падеж, мн.число ("ать" . 2) ; глаголы 1 спряжение ("его" . 3) ; прилагательные родительный падеж, муж. и ср.род ("еми" . 4) ; существительные творительный падеж, мн.число ("ему" . 5) ; прилагательные дательный падеж, муж. и ср.род ("емя" . 6) ; существительные родительный падеж, ед.число ("ете" . 7) ; глаголы 1 спряжение ("ешь" . 8) ; глаголы 1 спряжение ("ими" . 9) ; прилагательные творительный падеж, мн.число ("ить" . 10) ; глаголы 2 спряжения ("ишь" . 11) ; глаголы 2 спряжение ("ого" . 12) ; прилагательные родительный падеж, муж. и ср.род ("ому" . 13) ; прилагательные дательный падеж, муж. и ср.род ("ыми" . 14) ; прилагательные творительный падеж, мн число ("ышь" . 15) ; глаголы 1 спряжение ("ями" . 16) ; существительные творительный падеж, мн.число ("ять" . 17))) ; глаголы 1 спряжение ;; Получить последние 3 символа слова (defun last-three (word) (if (>= (length word) 3) (subseq word (- (length word) 3)) nil)) ;; Разбиение строки на слова (defun split-string (str) (let ((words nil) (current nil)) (dotimes (i (length str)) (let ((ch (char str i))) (if (char= ch #\Space) (when current (push (coerce (reverse current) 'string) words) (setf current nil)) (push ch current)))) (when current (push (coerce (reverse current) 'string) words)) (reverse words))) ;; Заменить слово на номер, если слово >= 3 букв и найдено в словаре (defun replace-word (word) (let ((ending (last-three word))) (if ending (let ((found (assoc ending *dict* :test #'string=))) (if found (cdr found) word)) word))) ;; Главная функция с использованием MAPCAR (defun process-text (text) (mapcar #'replace-word (split-string text))) ;; Тест (print (process-text "говорить то что думаешь")) (print (process-text "клетка с волнистыми попугаями")) (print (process-text "завтракаете с серебряными подстаканниками")) (print (process-text "счастливого нового года"))
Standard input is empty
(10 "то" "что" 8)
("клетка" "с" 14 16)
(7 "с" 14 1)
(12 12 "года")
Warning: reserving address range 0x80000c0000...0x1fffffffffff that contains memory mappings. clisp might crash later! Memory dump: 0x8000000000 - 0x80000bffff 0x146a11000000 - 0x146a112e4fff 0x146a11400000 - 0x146a11402fff 0x146a11403000 - 0x146a11601fff 0x146a11602000 - 0x146a11602fff 0x146a11603000 - 0x146a11603fff 0x146a11615000 - 0x146a11639fff 0x146a1163a000 - 0x146a117acfff 0x146a117ad000 - 0x146a117f5fff 0x146a117f6000 - 0x146a117f8fff 0x146a117f9000 - 0x146a117fbfff 0x146a117fc000 - 0x146a117fffff 0x146a11800000 - 0x146a11803fff 0x146a11804000 - 0x146a11a03fff 0x146a11a04000 - 0x146a11a04fff 0x146a11a05000 - 0x146a11a05fff 0x146a11a22000 - 0x146a11a23fff 0x146a11a24000 - 0x146a11a33fff 0x146a11a34000 - 0x146a11a67fff 0x146a11a68000 - 0x146a11b9efff 0x146a11b9f000 - 0x146a11b9ffff 0x146a11ba0000 - 0x146a11ba2fff 0x146a11ba3000 - 0x146a11ba3fff 0x146a11ba4000 - 0x146a11ba5fff 0x146a11ba6000 - 0x146a11ba6fff 0x146a11ba7000 - 0x146a11ba8fff 0x146a11ba9000 - 0x146a11ba9fff 0x146a11baa000 - 0x146a11baafff 0x146a11bab000 - 0x146a11babfff 0x146a11bac000 - 0x146a11bb9fff 0x146a11bba000 - 0x146a11bc7fff 0x146a11bc8000 - 0x146a11bd4fff 0x146a11bd5000 - 0x146a11bd8fff 0x146a11bd9000 - 0x146a11bd9fff 0x146a11bda000 - 0x146a11bdafff 0x146a11bdb000 - 0x146a11be0fff 0x146a11be1000 - 0x146a11be2fff 0x146a11be3000 - 0x146a11be3fff 0x146a11be4000 - 0x146a11be4fff 0x146a11be5000 - 0x146a11be5fff 0x146a11be6000 - 0x146a11c13fff 0x146a11c14000 - 0x146a11c22fff 0x146a11c23000 - 0x146a11cc8fff 0x146a11cc9000 - 0x146a11d5ffff 0x146a11d60000 - 0x146a11d60fff 0x146a11d61000 - 0x146a11d61fff 0x146a11d62000 - 0x146a11d75fff 0x146a11d76000 - 0x146a11d9dfff 0x146a11d9e000 - 0x146a11da7fff 0x146a11da8000 - 0x146a11da9fff 0x146a11daa000 - 0x146a11daffff 0x146a11db0000 - 0x146a11db2fff 0x146a11db5000 - 0x146a11db5fff 0x146a11db6000 - 0x146a11db6fff 0x146a11db7000 - 0x146a11db7fff 0x146a11db8000 - 0x146a11db8fff 0x146a11db9000 - 0x146a11db9fff 0x146a11dba000 - 0x146a11dc0fff 0x146a11dc1000 - 0x146a11dc3fff 0x146a11dc4000 - 0x146a11dc4fff 0x146a11dc5000 - 0x146a11de5fff 0x146a11de6000 - 0x146a11dedfff 0x146a11dee000 - 0x146a11deefff 0x146a11def000 - 0x146a11deffff 0x146a11df0000 - 0x146a11df0fff 0x55d1710a6000 - 0x55d171196fff 0x55d171197000 - 0x55d1712a0fff 0x55d1712a1000 - 0x55d171300fff 0x55d171302000 - 0x55d171330fff 0x55d171331000 - 0x55d171361fff 0x55d171362000 - 0x55d171365fff 0x55d172d26000 - 0x55d172d46fff 0x7ffd69e58000 - 0x7ffd69e78fff 0x7ffd69f98000 - 0x7ffd69f9bfff 0x7ffd69f9c000 - 0x7ffd69f9dfff