;; Гласные буквы русского языка (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) (split-word-recursive chars (cons (coerce (reverse (cons (elt chars (1+ i)) 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))))))))) ; Закрывающая скобка для let (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))) ; 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 0x14b604000000 - 0x14b6042e4fff 0x14b604415000 - 0x14b604439fff 0x14b60443a000 - 0x14b6045acfff 0x14b6045ad000 - 0x14b6045f5fff 0x14b6045f6000 - 0x14b6045f8fff 0x14b6045f9000 - 0x14b6045fbfff 0x14b6045fc000 - 0x14b6045fffff 0x14b604600000 - 0x14b604602fff 0x14b604603000 - 0x14b604801fff 0x14b604802000 - 0x14b604802fff 0x14b604803000 - 0x14b604803fff 0x14b604880000 - 0x14b60488ffff 0x14b604890000 - 0x14b6048c3fff 0x14b6048c4000 - 0x14b6049fafff 0x14b6049fb000 - 0x14b6049fbfff 0x14b6049fc000 - 0x14b6049fefff 0x14b6049ff000 - 0x14b6049fffff 0x14b604a00000 - 0x14b604a03fff 0x14b604a04000 - 0x14b604c03fff 0x14b604c04000 - 0x14b604c04fff 0x14b604c05000 - 0x14b604c05fff 0x14b604c24000 - 0x14b604c27fff 0x14b604c28000 - 0x14b604c28fff 0x14b604c29000 - 0x14b604c2afff 0x14b604c2b000 - 0x14b604c2bfff 0x14b604c2c000 - 0x14b604c2cfff 0x14b604c2d000 - 0x14b604c2dfff 0x14b604c2e000 - 0x14b604c3bfff 0x14b604c3c000 - 0x14b604c49fff 0x14b604c4a000 - 0x14b604c56fff 0x14b604c57000 - 0x14b604c5afff 0x14b604c5b000 - 0x14b604c5bfff 0x14b604c5c000 - 0x14b604c5cfff 0x14b604c5d000 - 0x14b604c62fff 0x14b604c63000 - 0x14b604c64fff 0x14b604c65000 - 0x14b604c65fff 0x14b604c66000 - 0x14b604c66fff 0x14b604c67000 - 0x14b604c67fff 0x14b604c68000 - 0x14b604c95fff 0x14b604c96000 - 0x14b604ca4fff 0x14b604ca5000 - 0x14b604d4afff 0x14b604d4b000 - 0x14b604de1fff 0x14b604de2000 - 0x14b604de2fff 0x14b604de3000 - 0x14b604de3fff 0x14b604de4000 - 0x14b604df7fff 0x14b604df8000 - 0x14b604e1ffff 0x14b604e20000 - 0x14b604e29fff 0x14b604e2a000 - 0x14b604e2bfff 0x14b604e2c000 - 0x14b604e31fff 0x14b604e32000 - 0x14b604e34fff 0x14b604e37000 - 0x14b604e37fff 0x14b604e38000 - 0x14b604e38fff 0x14b604e39000 - 0x14b604e39fff 0x14b604e3a000 - 0x14b604e3afff 0x14b604e3b000 - 0x14b604e3bfff 0x14b604e3c000 - 0x14b604e42fff 0x14b604e43000 - 0x14b604e45fff 0x14b604e46000 - 0x14b604e46fff 0x14b604e47000 - 0x14b604e67fff 0x14b604e68000 - 0x14b604e6ffff 0x14b604e70000 - 0x14b604e70fff 0x14b604e71000 - 0x14b604e71fff 0x14b604e72000 - 0x14b604e72fff 0x55986f5b9000 - 0x55986f6a9fff 0x55986f6aa000 - 0x55986f7b3fff 0x55986f7b4000 - 0x55986f813fff 0x55986f815000 - 0x55986f843fff 0x55986f844000 - 0x55986f874fff 0x55986f875000 - 0x55986f878fff 0x559870515000 - 0x559870535fff 0x7ffe016de000 - 0x7ffe016fefff 0x7ffe01772000 - 0x7ffe01775fff 0x7ffe01776000 - 0x7ffe01777fff