;; Словарь окончаний: последние 3 буквы -> номер семантического эквивалента (defparameter *dict* '(("ами" . 1) ; глаголы: делать, читать ("ать" . 2) ; глаголы: говорить, учить ("его" . 3) ; глаголы: говорить, учить ("еми" . 4) ; глаголы: смотреть, иметь ("ему" . 5) ; глаголы: мыть, крыть ("емя" . 6) ; прилагательные: красный, важный ("ете" . 7) ; прилагательные: русский, детский ("ешь" . 8) ; существительные: основа, корова ("ими" . 9) ; существительные: ученик, работник ("ить" . 10) ; родительный падеж: большого, нового ("ишь" . 11) ; дательный падеж: новому, первому ("ого" . 12) ; существительные: основа, корова ("ому" . 13) ; существительные: ученик, работник ("ыми" . 14) ; родительный падеж: большого, нового ("ышь" . 15) ; существительные: ученик, работник ("ями" . 16) ; родительный падеж: большого, новог ("ять" . 17))) ; дательный падеж: новому, первому ;; Получить последние 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)
("клетка" "с" 16)
(7 "с" 14 1)
(12 12 "года")
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