;; Гласные буквы русского языка (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)))) ;; Разбиение слова на слоги по правилам русского языка (рекурсивная версия без SETF) (defun split-word (word) (labels ((split-word-recursive (chars syllables current i) (cond ((>= i (length chars)) (if current (reverse (cons (coerce (reverse current) 'string) syllables)) (reverse syllables))) (t (let ((ch (elt chars i))) (cond ((vowel-p ch) (if (yot-after-vowel-p chars i) (let ((next-char (elt chars (1+ i)))) (let ((new-current (append current (list ch next-char)))) (split-word-recursive chars (cons (coerce (reverse new-current) 'string) syllables) nil (+ i 2)))) (split-word-recursive chars (cons (coerce (reverse (cons ch current)) 'string) syllables) nil (1+ i)))) (t (split-word-recursive chars syllables (cons ch current) (1+ i))))))))) (split-word-recursive (coerce word 'list) nil nil 0))) ;; Разбиение строки на слова (рекурсивная версия без SETF) (defun split-string (str) (labels ((split-string-recursive (str current-word words) (cond ((null str) (if current-word (reverse (cons (coerce (reverse current-word) 'string) words)) (reverse words))) ((char= (car str) #\Space) (if current-word (split-string-recursive (cdr str) nil (cons (coerce (reverse current-word) 'string) words)) (split-string-recursive (cdr str) nil words))) (t (split-string-recursive (cdr str) (cons (car str) current-word) words))))) (split-string-recursive (coerce str 'list) nil nil))) ;; Главная функция с использованием MAPCAR (defun split-phrase (phrase) (mapcar #'split-word (split-string 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 0x155542600000 - 0x1555428e4fff 0x155542a15000 - 0x155542a39fff 0x155542a3a000 - 0x155542bacfff 0x155542bad000 - 0x155542bf5fff 0x155542bf6000 - 0x155542bf8fff 0x155542bf9000 - 0x155542bfbfff 0x155542bfc000 - 0x155542bfffff 0x155542c00000 - 0x155542c02fff 0x155542c03000 - 0x155542e01fff 0x155542e02000 - 0x155542e02fff 0x155542e03000 - 0x155542e03fff 0x155542e80000 - 0x155542e8ffff 0x155542e90000 - 0x155542ec3fff 0x155542ec4000 - 0x155542ffafff 0x155542ffb000 - 0x155542ffbfff 0x155542ffc000 - 0x155542ffefff 0x155542fff000 - 0x155542ffffff 0x155543000000 - 0x155543003fff 0x155543004000 - 0x155543203fff 0x155543204000 - 0x155543204fff 0x155543205000 - 0x155543205fff 0x155543336000 - 0x155543339fff 0x15554333a000 - 0x15554333afff 0x15554333b000 - 0x15554333cfff 0x15554333d000 - 0x15554333dfff 0x15554333e000 - 0x15554333efff 0x15554333f000 - 0x15554333ffff 0x155543340000 - 0x15554334dfff 0x15554334e000 - 0x15554335bfff 0x15554335c000 - 0x155543368fff 0x155543369000 - 0x15554336cfff 0x15554336d000 - 0x15554336dfff 0x15554336e000 - 0x15554336efff 0x15554336f000 - 0x155543374fff 0x155543375000 - 0x155543376fff 0x155543377000 - 0x155543377fff 0x155543378000 - 0x155543378fff 0x155543379000 - 0x155543379fff 0x15554337a000 - 0x1555433a7fff 0x1555433a8000 - 0x1555433b6fff 0x1555433b7000 - 0x15554345cfff 0x15554345d000 - 0x1555434f3fff 0x1555434f4000 - 0x1555434f4fff 0x1555434f5000 - 0x1555434f5fff 0x1555434f6000 - 0x155543509fff 0x15554350a000 - 0x155543531fff 0x155543532000 - 0x15554353bfff 0x15554353c000 - 0x15554353dfff 0x15554353e000 - 0x155543543fff 0x155543544000 - 0x155543546fff 0x155543549000 - 0x155543549fff 0x15554354a000 - 0x15554354afff 0x15554354b000 - 0x15554354bfff 0x15554354c000 - 0x15554354cfff 0x15554354d000 - 0x15554354dfff 0x15554354e000 - 0x155543554fff 0x155543555000 - 0x155543557fff 0x155543558000 - 0x155543558fff 0x155543559000 - 0x155543579fff 0x15554357a000 - 0x155543581fff 0x155543582000 - 0x155543582fff 0x155543583000 - 0x155543583fff 0x155543584000 - 0x155543584fff 0x55af0409e000 - 0x55af0418efff 0x55af0418f000 - 0x55af04298fff 0x55af04299000 - 0x55af042f8fff 0x55af042fa000 - 0x55af04328fff 0x55af04329000 - 0x55af04359fff 0x55af0435a000 - 0x55af0435dfff 0x55af05b8f000 - 0x55af05baffff 0x7ffc3288e000 - 0x7ffc328aefff 0x7ffc329a6000 - 0x7ffc329a9fff 0x7ffc329aa000 - 0x7ffc329abfff