;; Гласные буквы русского языка (defun vowel-p (char) (member char '(#\а #\е #\ё #\и #\о #\у #\ы #\э #\ю #\я #\А #\Е #\Ё #\И #\О #\У #\Ы #\Э #\Ю #\Я) :test #'char=)) ;; Согласные буквы русского языка (defun consonant-p (char) (not (vowel-p char))) ;; Функция для проверки наличия "й" после гласной (defun yot-after-vowel-p (chars index) (and (< index (1- (length chars))) (char= (elt chars (1+ index)) #\й) (vowel-p (elt chars index)))) ;; Функция для проверки наличия удвоенной согласной после гласной (defun double-consonant-after-vowel-p (chars index) (and (< index (1- (length chars))) (consonant-p (elt chars (1+ index))) (char= (elt chars index) (elt chars (1+ index))))) ;; Разбиение слова на слоги по правилам русского языка (улучшенная версия) (defun split-word (word) (let ((chars (coerce word 'list)) (syllables nil) (current nil) (i 0)) (loop while (< i (length chars)) do (let ((ch (elt chars i))) (push ch current) (cond ((vowel-p ch) ;Проверка на "й" после гласной (if (yot-after-vowel-p chars i) (progn (push (elt chars (incf i)) current) ;включить "й" в текущий слог (push (coerce (reverse current) 'string) syllables) (setf current nil)) ; Проверка на удвоенную согласную после гласной (if (double-consonant-after-vowel-p chars i) (progn (push (coerce (reverse current) 'string) syllables) ;закончить слог с гласной (setf syllables (cons (string (elt chars (incf i))) syllables)) ; Создать новый слог с согласной и добавить его (setf current nil) ) (progn (push (coerce (reverse current) 'string) syllables) (setf current nil)))) ) (t nil)) ;просто продолжаем, если это не гласная (incf i))) ;перейти к следующему символу (when current ;Обработка остатка в конце слова (if syllables (setf (car syllables) (concatenate 'string (car syllables) (coerce (reverse current) 'string))) (push (coerce (reverse current) 'string) syllables))) (reverse syllables))) ;; Разбиение строки на слова (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))) ;; Главная функция с использованием MAPCAR (defun split-phrase (phrase) (mapcar #'split-word (split-string phrase))) ; Using MAPCAR ;; Тест (print (split-phrase "написать программу ")) (print (split-phrase "дана фраза на русском языке ")) (print (split-phrase "война, мир, эвакуатор ")) (print (split-phrase "скамейка ")) (print (split-phrase "ванна")) (print (split-phrase "коллекция")) (print (split-phrase "длинный")) (print (split-phrase "касса")) (print (split-phrase "ван-на"))
Standard input is empty
(("на" "пи" "сать") ("про" "гра" "мму"))
(("да" "на") ("фра" "за") ("на") ("ру" "сском") ("я" "зы" "ке"))
(("вой" "на,") ("мир,") ("э" "ва" "ку" "а" "тор"))
(("ска" "мей" "ка"))
(("ва" "нна"))
(("ко" "лле" "кци" "я"))
(("дли" "нный"))
(("ка" "сса"))
(("ва" "н-на"))
Warning: reserving address range 0x80000c0000...0x1fffffffffff that contains memory mappings. clisp might crash later! Memory dump: 0x8000000000 - 0x80000bffff 0x14a835a00000 - 0x14a835ce4fff 0x14a835e00000 - 0x14a835e02fff 0x14a835e03000 - 0x14a836001fff 0x14a836002000 - 0x14a836002fff 0x14a836003000 - 0x14a836003fff 0x14a836015000 - 0x14a836039fff 0x14a83603a000 - 0x14a8361acfff 0x14a8361ad000 - 0x14a8361f5fff 0x14a8361f6000 - 0x14a8361f8fff 0x14a8361f9000 - 0x14a8361fbfff 0x14a8361fc000 - 0x14a8361fffff 0x14a836200000 - 0x14a836203fff 0x14a836204000 - 0x14a836403fff 0x14a836404000 - 0x14a836404fff 0x14a836405000 - 0x14a836405fff 0x14a83643f000 - 0x14a836440fff 0x14a836441000 - 0x14a836450fff 0x14a836451000 - 0x14a836484fff 0x14a836485000 - 0x14a8365bbfff 0x14a8365bc000 - 0x14a8365bcfff 0x14a8365bd000 - 0x14a8365bffff 0x14a8365c0000 - 0x14a8365c0fff 0x14a8365c1000 - 0x14a8365c2fff 0x14a8365c3000 - 0x14a8365c3fff 0x14a8365c4000 - 0x14a8365c5fff 0x14a8365c6000 - 0x14a8365c6fff 0x14a8365c7000 - 0x14a8365c7fff 0x14a8365c8000 - 0x14a8365c8fff 0x14a8365c9000 - 0x14a8365d6fff 0x14a8365d7000 - 0x14a8365e4fff 0x14a8365e5000 - 0x14a8365f1fff 0x14a8365f2000 - 0x14a8365f5fff 0x14a8365f6000 - 0x14a8365f6fff 0x14a8365f7000 - 0x14a8365f7fff 0x14a8365f8000 - 0x14a8365fdfff 0x14a8365fe000 - 0x14a8365fffff 0x14a836600000 - 0x14a836600fff 0x14a836601000 - 0x14a836601fff 0x14a836602000 - 0x14a836602fff 0x14a836603000 - 0x14a836630fff 0x14a836631000 - 0x14a83663ffff 0x14a836640000 - 0x14a8366e5fff 0x14a8366e6000 - 0x14a83677cfff 0x14a83677d000 - 0x14a83677dfff 0x14a83677e000 - 0x14a83677efff 0x14a83677f000 - 0x14a836792fff 0x14a836793000 - 0x14a8367bafff 0x14a8367bb000 - 0x14a8367c4fff 0x14a8367c5000 - 0x14a8367c6fff 0x14a8367c7000 - 0x14a8367ccfff 0x14a8367cd000 - 0x14a8367cffff 0x14a8367d2000 - 0x14a8367d2fff 0x14a8367d3000 - 0x14a8367d3fff 0x14a8367d4000 - 0x14a8367d4fff 0x14a8367d5000 - 0x14a8367d5fff 0x14a8367d6000 - 0x14a8367d6fff 0x14a8367d7000 - 0x14a8367ddfff 0x14a8367de000 - 0x14a8367e0fff 0x14a8367e1000 - 0x14a8367e1fff 0x14a8367e2000 - 0x14a836802fff 0x14a836803000 - 0x14a83680afff 0x14a83680b000 - 0x14a83680bfff 0x14a83680c000 - 0x14a83680cfff 0x14a83680d000 - 0x14a83680dfff 0x5609a0222000 - 0x5609a0312fff 0x5609a0313000 - 0x5609a041cfff 0x5609a041d000 - 0x5609a047cfff 0x5609a047e000 - 0x5609a04acfff 0x5609a04ad000 - 0x5609a04ddfff 0x5609a04de000 - 0x5609a04e1fff 0x5609a0e92000 - 0x5609a0eb2fff 0x7ffed509f000 - 0x7ffed50bffff 0x7ffed510c000 - 0x7ffed510ffff 0x7ffed5110000 - 0x7ffed5111fff