;; Гласные буквы русского языка (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)) (let ((next-char (elt chars (1+ index)))) (or (char= next-char #\й) (member next-char '(#\е #\ё #\ю #\я) :test #'char=))) (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)))) (cond ((char= next-char #\й) (let ((new-current (append current (list ch next-char)))) (split-word-recursive chars (cons (coerce (reverse new-current) 'string) syllables) nil (+ i 2)))) ((member next-char '(#\е #\ё #\ю #\я) :test #'char=) (split-word-recursive chars (cons (coerce (reverse (cons ch current)) 'string) syllables) nil (+ i 1))) (t (split-word-recursive chars (cons (coerce (reverse (cons ch current)) 'string) syllables) nil (+ i 1))))) (split-word-recursive chars (cons (coerce (reverse (cons ch current)) 'string) syllables) nil (+ i 1)))) (t (split-word-recursive chars syllables (cons ch current) (+ i 1))))))))) (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 0x14d829200000 - 0x14d8294e4fff 0x14d829615000 - 0x14d829639fff 0x14d82963a000 - 0x14d8297acfff 0x14d8297ad000 - 0x14d8297f5fff 0x14d8297f6000 - 0x14d8297f8fff 0x14d8297f9000 - 0x14d8297fbfff 0x14d8297fc000 - 0x14d8297fffff 0x14d829800000 - 0x14d829802fff 0x14d829803000 - 0x14d829a01fff 0x14d829a02000 - 0x14d829a02fff 0x14d829a03000 - 0x14d829a03fff 0x14d829a80000 - 0x14d829a8ffff 0x14d829a90000 - 0x14d829ac3fff 0x14d829ac4000 - 0x14d829bfafff 0x14d829bfb000 - 0x14d829bfbfff 0x14d829bfc000 - 0x14d829bfefff 0x14d829bff000 - 0x14d829bfffff 0x14d829c00000 - 0x14d829c03fff 0x14d829c04000 - 0x14d829e03fff 0x14d829e04000 - 0x14d829e04fff 0x14d829e05000 - 0x14d829e05fff 0x14d829eb3000 - 0x14d829eb6fff 0x14d829eb7000 - 0x14d829eb7fff 0x14d829eb8000 - 0x14d829eb9fff 0x14d829eba000 - 0x14d829ebafff 0x14d829ebb000 - 0x14d829ebbfff 0x14d829ebc000 - 0x14d829ebcfff 0x14d829ebd000 - 0x14d829ecafff 0x14d829ecb000 - 0x14d829ed8fff 0x14d829ed9000 - 0x14d829ee5fff 0x14d829ee6000 - 0x14d829ee9fff 0x14d829eea000 - 0x14d829eeafff 0x14d829eeb000 - 0x14d829eebfff 0x14d829eec000 - 0x14d829ef1fff 0x14d829ef2000 - 0x14d829ef3fff 0x14d829ef4000 - 0x14d829ef4fff 0x14d829ef5000 - 0x14d829ef5fff 0x14d829ef6000 - 0x14d829ef6fff 0x14d829ef7000 - 0x14d829f24fff 0x14d829f25000 - 0x14d829f33fff 0x14d829f34000 - 0x14d829fd9fff 0x14d829fda000 - 0x14d82a070fff 0x14d82a071000 - 0x14d82a071fff 0x14d82a072000 - 0x14d82a072fff 0x14d82a073000 - 0x14d82a086fff 0x14d82a087000 - 0x14d82a0aefff 0x14d82a0af000 - 0x14d82a0b8fff 0x14d82a0b9000 - 0x14d82a0bafff 0x14d82a0bb000 - 0x14d82a0c0fff 0x14d82a0c1000 - 0x14d82a0c3fff 0x14d82a0c6000 - 0x14d82a0c6fff 0x14d82a0c7000 - 0x14d82a0c7fff 0x14d82a0c8000 - 0x14d82a0c8fff 0x14d82a0c9000 - 0x14d82a0c9fff 0x14d82a0ca000 - 0x14d82a0cafff 0x14d82a0cb000 - 0x14d82a0d1fff 0x14d82a0d2000 - 0x14d82a0d4fff 0x14d82a0d5000 - 0x14d82a0d5fff 0x14d82a0d6000 - 0x14d82a0f6fff 0x14d82a0f7000 - 0x14d82a0fefff 0x14d82a0ff000 - 0x14d82a0fffff 0x14d82a100000 - 0x14d82a100fff 0x14d82a101000 - 0x14d82a101fff 0x56308a425000 - 0x56308a515fff 0x56308a516000 - 0x56308a61ffff 0x56308a620000 - 0x56308a67ffff 0x56308a681000 - 0x56308a6affff 0x56308a6b0000 - 0x56308a6e0fff 0x56308a6e1000 - 0x56308a6e4fff 0x56308bcb5000 - 0x56308bcd5fff 0x7fff9ea2a000 - 0x7fff9ea4afff 0x7fff9eb7e000 - 0x7fff9eb81fff 0x7fff9eb82000 - 0x7fff9eb83fff