fork download
  1. ;; Словарь окончаний: последние 3 буквы -> номер семантического эквивалента
  2. (defparameter *dict*
  3. '(("ами" . 1) ; существительные творительный падеж, мн.число
  4. ("ать" . 2) ; глаголы 1 спряжение
  5. ("его" . 3) ; прилагательные родительный падеж, муж. и ср.род
  6. ("еми" . 4) ; существительные творительный падеж, мн.число
  7. ("ему" . 5) ; прилагательные дательный падеж, муж. и ср.род
  8. ("емя" . 6) ; существительные родительный падеж, ед.число
  9. ("ете" . 7) ; глаголы 1 спряжение
  10. ("ешь" . 8) ; глаголы 1 спряжение
  11. ("ими" . 9) ; прилагательные творительный падеж, мн.число
  12. ("ить" . 10) ; глаголы 2 спряжения
  13. ("ишь" . 11) ; глаголы 2 спряжение
  14. ("ого" . 12) ; прилагательные родительный падеж, муж. и ср.род
  15. ("ому" . 13) ; прилагательные дательный падеж, муж. и ср.род
  16. ("ыми" . 14) ; прилагательные творительный падеж, мн число
  17. ("ышь" . 15) ; глаголы 1 спряжение
  18. ("ями" . 16) ; существительные творительный падеж, мн.число
  19. ("ять" . 17))) ; глаголы 1 спряжение
  20.  
  21. ;; Получить последние 3 символа слова
  22. (defun last-three (word)
  23. (if (>= (length word) 3)
  24. (subseq word (- (length word) 3))
  25. nil))
  26.  
  27. ;; Разбиение строки на слова
  28. (defun split-string (str)
  29. (let ((words nil) (current nil))
  30. (dotimes (i (length str))
  31. (let ((ch (char str i)))
  32. (if (char= ch #\Space)
  33. (when current
  34. (push (coerce (reverse current) 'string) words)
  35. (setf current nil))
  36. (push ch current))))
  37. (when current
  38. (push (coerce (reverse current) 'string) words))
  39. (reverse words)))
  40.  
  41. ;; Заменить слово на номер, если слово >= 3 букв и найдено в словаре
  42. (defun replace-word (word)
  43. (let ((ending (last-three word)))
  44. (if ending
  45. (let ((found (assoc ending *dict* :test #'string=)))
  46. (if found (cdr found) word))
  47. word)))
  48.  
  49. ;; Главная функция с использованием MAPCAR
  50. (defun process-text (text)
  51. (mapcar #'replace-word (split-string text)))
  52.  
  53. ;; Тест
  54. (print (process-text "говорить то что думаешь"))
  55. (print (process-text "клетка с волнистыми попугаями"))
  56. (print (process-text "завтракаете с серебряными подстаканниками"))
  57. (print (process-text "счастливого нового года"))
  58.  
Success #stdin #stdout #stderr 0.01s 9704KB
stdin
Standard input is empty
stdout
(10 "то" "что" 8) 
("клетка" "с" 14 16) 
(7 "с" 14 1) 
(12 12 "года") 
stderr
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