;; Гласные буквы русского языка (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)))) (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))) (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 0x14a37d400000 - 0x14a37d6e4fff 0x14a37d815000 - 0x14a37d839fff 0x14a37d83a000 - 0x14a37d9acfff 0x14a37d9ad000 - 0x14a37d9f5fff 0x14a37d9f6000 - 0x14a37d9f8fff 0x14a37d9f9000 - 0x14a37d9fbfff 0x14a37d9fc000 - 0x14a37d9fffff 0x14a37da00000 - 0x14a37da02fff 0x14a37da03000 - 0x14a37dc01fff 0x14a37dc02000 - 0x14a37dc02fff 0x14a37dc03000 - 0x14a37dc03fff 0x14a37dc80000 - 0x14a37dc8ffff 0x14a37dc90000 - 0x14a37dcc3fff 0x14a37dcc4000 - 0x14a37ddfafff 0x14a37ddfb000 - 0x14a37ddfbfff 0x14a37ddfc000 - 0x14a37ddfefff 0x14a37ddff000 - 0x14a37ddfffff 0x14a37de00000 - 0x14a37de03fff 0x14a37de04000 - 0x14a37e003fff 0x14a37e004000 - 0x14a37e004fff 0x14a37e005000 - 0x14a37e005fff 0x14a37e118000 - 0x14a37e11bfff 0x14a37e11c000 - 0x14a37e11cfff 0x14a37e11d000 - 0x14a37e11efff 0x14a37e11f000 - 0x14a37e11ffff 0x14a37e120000 - 0x14a37e120fff 0x14a37e121000 - 0x14a37e121fff 0x14a37e122000 - 0x14a37e12ffff 0x14a37e130000 - 0x14a37e13dfff 0x14a37e13e000 - 0x14a37e14afff 0x14a37e14b000 - 0x14a37e14efff 0x14a37e14f000 - 0x14a37e14ffff 0x14a37e150000 - 0x14a37e150fff 0x14a37e151000 - 0x14a37e156fff 0x14a37e157000 - 0x14a37e158fff 0x14a37e159000 - 0x14a37e159fff 0x14a37e15a000 - 0x14a37e15afff 0x14a37e15b000 - 0x14a37e15bfff 0x14a37e15c000 - 0x14a37e189fff 0x14a37e18a000 - 0x14a37e198fff 0x14a37e199000 - 0x14a37e23efff 0x14a37e23f000 - 0x14a37e2d5fff 0x14a37e2d6000 - 0x14a37e2d6fff 0x14a37e2d7000 - 0x14a37e2d7fff 0x14a37e2d8000 - 0x14a37e2ebfff 0x14a37e2ec000 - 0x14a37e313fff 0x14a37e314000 - 0x14a37e31dfff 0x14a37e31e000 - 0x14a37e31ffff 0x14a37e320000 - 0x14a37e325fff 0x14a37e326000 - 0x14a37e328fff 0x14a37e32b000 - 0x14a37e32bfff 0x14a37e32c000 - 0x14a37e32cfff 0x14a37e32d000 - 0x14a37e32dfff 0x14a37e32e000 - 0x14a37e32efff 0x14a37e32f000 - 0x14a37e32ffff 0x14a37e330000 - 0x14a37e336fff 0x14a37e337000 - 0x14a37e339fff 0x14a37e33a000 - 0x14a37e33afff 0x14a37e33b000 - 0x14a37e35bfff 0x14a37e35c000 - 0x14a37e363fff 0x14a37e364000 - 0x14a37e364fff 0x14a37e365000 - 0x14a37e365fff 0x14a37e366000 - 0x14a37e366fff 0x55ba352c2000 - 0x55ba353b2fff 0x55ba353b3000 - 0x55ba354bcfff 0x55ba354bd000 - 0x55ba3551cfff 0x55ba3551e000 - 0x55ba3554cfff 0x55ba3554d000 - 0x55ba3557dfff 0x55ba3557e000 - 0x55ba35581fff 0x55ba37326000 - 0x55ba37346fff 0x7fff3a0b8000 - 0x7fff3a0d8fff 0x7fff3a1d3000 - 0x7fff3a1d6fff 0x7fff3a1d7000 - 0x7fff3a1d8fff