;; Гласные буквы русского языка (defun vowel-p (char) (member char '(#\а #\е #\ё #\и #\о #\у #\ы #\э #\ю #\я #\А #\Е #\Ё #\И #\О #\У #\Ы #\Э #\Ю #\Я) :test #'char=)) ;; Согласные буквы русского языка (defun consonant-p (char) (not (vowel-p char))) ;; Функция для проверки наличия "й" после гласной (defun yot-after-vowel-p (chars index) (and (< (1+ index) (length chars)) (char= (elt chars (1+ index)) #\й) (vowel-p (elt chars 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 (incf i) (push (elt chars i) current) ; Включаем "й" в текущий слог (push (coerce (reverse current) 'string) 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 "чай"))
Standard input is empty
(("на" "пи" "сать") ("про" "гра" "мму"))
(("да" "на") ("фра" "за") ("на") ("ру" "сском") ("я" "зы" "ке"))
(("вой" "на,") ("мир,") ("э" "ва" "ку" "а" "тор"))
(("ска" "мей" "ка"))
(("ва" "нна"))
(("ко" "лле" "кци" "я"))
(("чай"))
Warning: reserving address range 0x80000c0000...0x1fffffffffff that contains memory mappings. clisp might crash later! Memory dump: 0x8000000000 - 0x80000bffff 0x150c86c00000 - 0x150c86ee4fff 0x150c87015000 - 0x150c87039fff 0x150c8703a000 - 0x150c871acfff 0x150c871ad000 - 0x150c871f5fff 0x150c871f6000 - 0x150c871f8fff 0x150c871f9000 - 0x150c871fbfff 0x150c871fc000 - 0x150c871fffff 0x150c87200000 - 0x150c87202fff 0x150c87203000 - 0x150c87401fff 0x150c87402000 - 0x150c87402fff 0x150c87403000 - 0x150c87403fff 0x150c87480000 - 0x150c8748ffff 0x150c87490000 - 0x150c874c3fff 0x150c874c4000 - 0x150c875fafff 0x150c875fb000 - 0x150c875fbfff 0x150c875fc000 - 0x150c875fefff 0x150c875ff000 - 0x150c875fffff 0x150c87600000 - 0x150c87603fff 0x150c87604000 - 0x150c87803fff 0x150c87804000 - 0x150c87804fff 0x150c87805000 - 0x150c87805fff 0x150c87920000 - 0x150c87923fff 0x150c87924000 - 0x150c87924fff 0x150c87925000 - 0x150c87926fff 0x150c87927000 - 0x150c87927fff 0x150c87928000 - 0x150c87928fff 0x150c87929000 - 0x150c87929fff 0x150c8792a000 - 0x150c87937fff 0x150c87938000 - 0x150c87945fff 0x150c87946000 - 0x150c87952fff 0x150c87953000 - 0x150c87956fff 0x150c87957000 - 0x150c87957fff 0x150c87958000 - 0x150c87958fff 0x150c87959000 - 0x150c8795efff 0x150c8795f000 - 0x150c87960fff 0x150c87961000 - 0x150c87961fff 0x150c87962000 - 0x150c87962fff 0x150c87963000 - 0x150c87963fff 0x150c87964000 - 0x150c87991fff 0x150c87992000 - 0x150c879a0fff 0x150c879a1000 - 0x150c87a46fff 0x150c87a47000 - 0x150c87addfff 0x150c87ade000 - 0x150c87adefff 0x150c87adf000 - 0x150c87adffff 0x150c87ae0000 - 0x150c87af3fff 0x150c87af4000 - 0x150c87b1bfff 0x150c87b1c000 - 0x150c87b25fff 0x150c87b26000 - 0x150c87b27fff 0x150c87b28000 - 0x150c87b2dfff 0x150c87b2e000 - 0x150c87b30fff 0x150c87b33000 - 0x150c87b33fff 0x150c87b34000 - 0x150c87b34fff 0x150c87b35000 - 0x150c87b35fff 0x150c87b36000 - 0x150c87b36fff 0x150c87b37000 - 0x150c87b37fff 0x150c87b38000 - 0x150c87b3efff 0x150c87b3f000 - 0x150c87b41fff 0x150c87b42000 - 0x150c87b42fff 0x150c87b43000 - 0x150c87b63fff 0x150c87b64000 - 0x150c87b6bfff 0x150c87b6c000 - 0x150c87b6cfff 0x150c87b6d000 - 0x150c87b6dfff 0x150c87b6e000 - 0x150c87b6efff 0x560696dd1000 - 0x560696ec1fff 0x560696ec2000 - 0x560696fcbfff 0x560696fcc000 - 0x56069702bfff 0x56069702d000 - 0x56069705bfff 0x56069705c000 - 0x56069708cfff 0x56069708d000 - 0x560697090fff 0x5606973c2000 - 0x5606973e2fff 0x7ffe6f9a7000 - 0x7ffe6f9c7fff 0x7ffe6f9e2000 - 0x7ffe6f9e5fff 0x7ffe6f9e6000 - 0x7ffe6f9e7fff