fork download
  1. ;; Словарь окончаний: последние 3 буквы -> номер семантического эквивалента
  2. (defparameter *dict*
  3. '(("ами" . 1) ; глаголы: делать, читать
  4. ("ать" . 2) ; глаголы: говорить, учить
  5. ("его" . 3) ; глаголы: говорить, учить
  6. ("еми" . 4) ; глаголы: смотреть, иметь
  7. ("ему" . 5) ; глаголы: мыть, крыть
  8. ("емя" . 6) ; прилагательные: красный, важный
  9. ("ете" . 7) ; прилагательные: русский, детский
  10. ("ешь" . 8) ; существительные: основа, корова
  11. ("ими" . 9) ; существительные: ученик, работник
  12. ("ить" . 10) ; родительный падеж: большого, нового
  13. ("ишь" . 11) ; дательный падеж: новому, первому
  14. ("ого" . 12) ; существительные: основа, корова
  15. ("ому" . 13) ; существительные: ученик, работник
  16. ("ыми" . 14) ; родительный падеж: большого, нового
  17. ("ышь" . 15) ; существительные: ученик, работник
  18. ("ями" . 16) ; родительный падеж: большого, новог
  19. ("ять" . 17))) ; дательный падеж: новому, первому
  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 9660KB
stdin
Standard input is empty
stdout
(10 "то" "что" 8) 
("клетка" "с" 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
  0x14b4da000000 - 0x14b4da2e4fff
  0x14b4da415000 - 0x14b4da439fff
  0x14b4da43a000 - 0x14b4da5acfff
  0x14b4da5ad000 - 0x14b4da5f5fff
  0x14b4da5f6000 - 0x14b4da5f8fff
  0x14b4da5f9000 - 0x14b4da5fbfff
  0x14b4da5fc000 - 0x14b4da5fffff
  0x14b4da600000 - 0x14b4da602fff
  0x14b4da603000 - 0x14b4da801fff
  0x14b4da802000 - 0x14b4da802fff
  0x14b4da803000 - 0x14b4da803fff
  0x14b4da880000 - 0x14b4da88ffff
  0x14b4da890000 - 0x14b4da8c3fff
  0x14b4da8c4000 - 0x14b4da9fafff
  0x14b4da9fb000 - 0x14b4da9fbfff
  0x14b4da9fc000 - 0x14b4da9fefff
  0x14b4da9ff000 - 0x14b4da9fffff
  0x14b4daa00000 - 0x14b4daa03fff
  0x14b4daa04000 - 0x14b4dac03fff
  0x14b4dac04000 - 0x14b4dac04fff
  0x14b4dac05000 - 0x14b4dac05fff
  0x14b4dac54000 - 0x14b4dac57fff
  0x14b4dac58000 - 0x14b4dac58fff
  0x14b4dac59000 - 0x14b4dac5afff
  0x14b4dac5b000 - 0x14b4dac5bfff
  0x14b4dac5c000 - 0x14b4dac5cfff
  0x14b4dac5d000 - 0x14b4dac5dfff
  0x14b4dac5e000 - 0x14b4dac6bfff
  0x14b4dac6c000 - 0x14b4dac79fff
  0x14b4dac7a000 - 0x14b4dac86fff
  0x14b4dac87000 - 0x14b4dac8afff
  0x14b4dac8b000 - 0x14b4dac8bfff
  0x14b4dac8c000 - 0x14b4dac8cfff
  0x14b4dac8d000 - 0x14b4dac92fff
  0x14b4dac93000 - 0x14b4dac94fff
  0x14b4dac95000 - 0x14b4dac95fff
  0x14b4dac96000 - 0x14b4dac96fff
  0x14b4dac97000 - 0x14b4dac97fff
  0x14b4dac98000 - 0x14b4dacc5fff
  0x14b4dacc6000 - 0x14b4dacd4fff
  0x14b4dacd5000 - 0x14b4dad7afff
  0x14b4dad7b000 - 0x14b4dae11fff
  0x14b4dae12000 - 0x14b4dae12fff
  0x14b4dae13000 - 0x14b4dae13fff
  0x14b4dae14000 - 0x14b4dae27fff
  0x14b4dae28000 - 0x14b4dae4ffff
  0x14b4dae50000 - 0x14b4dae59fff
  0x14b4dae5a000 - 0x14b4dae5bfff
  0x14b4dae5c000 - 0x14b4dae61fff
  0x14b4dae62000 - 0x14b4dae64fff
  0x14b4dae67000 - 0x14b4dae67fff
  0x14b4dae68000 - 0x14b4dae68fff
  0x14b4dae69000 - 0x14b4dae69fff
  0x14b4dae6a000 - 0x14b4dae6afff
  0x14b4dae6b000 - 0x14b4dae6bfff
  0x14b4dae6c000 - 0x14b4dae72fff
  0x14b4dae73000 - 0x14b4dae75fff
  0x14b4dae76000 - 0x14b4dae76fff
  0x14b4dae77000 - 0x14b4dae97fff
  0x14b4dae98000 - 0x14b4dae9ffff
  0x14b4daea0000 - 0x14b4daea0fff
  0x14b4daea1000 - 0x14b4daea1fff
  0x14b4daea2000 - 0x14b4daea2fff
  0x55df3ddac000 - 0x55df3de9cfff
  0x55df3de9d000 - 0x55df3dfa6fff
  0x55df3dfa7000 - 0x55df3e006fff
  0x55df3e008000 - 0x55df3e036fff
  0x55df3e037000 - 0x55df3e067fff
  0x55df3e068000 - 0x55df3e06bfff
  0x55df3f726000 - 0x55df3f746fff
  0x7ffc60b7f000 - 0x7ffc60b9ffff
  0x7ffc60bd1000 - 0x7ffc60bd4fff
  0x7ffc60bd5000 - 0x7ffc60bd6fff