;; Гласные буквы русского языка (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 ((process-syllable (chars syllables current index) (cond ((>= index (length chars)) (if current (let ((new-syllable (coerce (reverse current) 'string))) (cond (syllables (cons (concatenate 'string (car syllables) new-syllable) (cdr syllables))) (t (list new-syllable)))) syllables)) ((vowel-p (elt chars index)) (if (yot-after-vowel-p chars index) (let ((new-syllable (coerce (reverse (cons (elt chars index) (cons (elt chars (+ 1 index)) current))) 'string))) (process-syllable (subseq chars (+ 2 index)) (cons new-syllable syllables) nil 0)) (let ((new-syllable (coerce (reverse (cons (elt chars index) current)) 'string))) (process-syllable (subseq chars (+ 1 index)) (cons new-syllable syllables) nil 0)))) (t (process-syllable chars syllables (cons (elt chars index) current) (+ 1 index)))))) (reverse (process-syllable (coerce word 'list) nil nil 0)))) ;; Разбиение строки на слова (без SETF) (defun split-string (str) (labels ((process-string (string words current index) (cond ((>= index (length string)) (if current (cons (coerce (reverse current) 'string) words) words)) ((char= (char string index) #\Space) (if current (process-string string (cons (coerce (reverse current) 'string) words) nil (+ 1 index)) (process-string string words nil (+ 1 index)))) (t (process-string string words (cons (char string index) current) (+ 1 index)))))) (reverse (process-string str nil nil 0)))) ;; Главная функция с использованием 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 "чай")) (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 0x152fa7000000 - 0x152fa72e4fff 0x152fa7415000 - 0x152fa7439fff 0x152fa743a000 - 0x152fa75acfff 0x152fa75ad000 - 0x152fa75f5fff 0x152fa75f6000 - 0x152fa75f8fff 0x152fa75f9000 - 0x152fa75fbfff 0x152fa75fc000 - 0x152fa75fffff 0x152fa7600000 - 0x152fa7602fff 0x152fa7603000 - 0x152fa7801fff 0x152fa7802000 - 0x152fa7802fff 0x152fa7803000 - 0x152fa7803fff 0x152fa7880000 - 0x152fa788ffff 0x152fa7890000 - 0x152fa78c3fff 0x152fa78c4000 - 0x152fa79fafff 0x152fa79fb000 - 0x152fa79fbfff 0x152fa79fc000 - 0x152fa79fefff 0x152fa79ff000 - 0x152fa79fffff 0x152fa7a00000 - 0x152fa7a03fff 0x152fa7a04000 - 0x152fa7c03fff 0x152fa7c04000 - 0x152fa7c04fff 0x152fa7c05000 - 0x152fa7c05fff 0x152fa7d68000 - 0x152fa7d6bfff 0x152fa7d6c000 - 0x152fa7d6cfff 0x152fa7d6d000 - 0x152fa7d6efff 0x152fa7d6f000 - 0x152fa7d6ffff 0x152fa7d70000 - 0x152fa7d70fff 0x152fa7d71000 - 0x152fa7d71fff 0x152fa7d72000 - 0x152fa7d7ffff 0x152fa7d80000 - 0x152fa7d8dfff 0x152fa7d8e000 - 0x152fa7d9afff 0x152fa7d9b000 - 0x152fa7d9efff 0x152fa7d9f000 - 0x152fa7d9ffff 0x152fa7da0000 - 0x152fa7da0fff 0x152fa7da1000 - 0x152fa7da6fff 0x152fa7da7000 - 0x152fa7da8fff 0x152fa7da9000 - 0x152fa7da9fff 0x152fa7daa000 - 0x152fa7daafff 0x152fa7dab000 - 0x152fa7dabfff 0x152fa7dac000 - 0x152fa7dd9fff 0x152fa7dda000 - 0x152fa7de8fff 0x152fa7de9000 - 0x152fa7e8efff 0x152fa7e8f000 - 0x152fa7f25fff 0x152fa7f26000 - 0x152fa7f26fff 0x152fa7f27000 - 0x152fa7f27fff 0x152fa7f28000 - 0x152fa7f3bfff 0x152fa7f3c000 - 0x152fa7f63fff 0x152fa7f64000 - 0x152fa7f6dfff 0x152fa7f6e000 - 0x152fa7f6ffff 0x152fa7f70000 - 0x152fa7f75fff 0x152fa7f76000 - 0x152fa7f78fff 0x152fa7f7b000 - 0x152fa7f7bfff 0x152fa7f7c000 - 0x152fa7f7cfff 0x152fa7f7d000 - 0x152fa7f7dfff 0x152fa7f7e000 - 0x152fa7f7efff 0x152fa7f7f000 - 0x152fa7f7ffff 0x152fa7f80000 - 0x152fa7f86fff 0x152fa7f87000 - 0x152fa7f89fff 0x152fa7f8a000 - 0x152fa7f8afff 0x152fa7f8b000 - 0x152fa7fabfff 0x152fa7fac000 - 0x152fa7fb3fff 0x152fa7fb4000 - 0x152fa7fb4fff 0x152fa7fb5000 - 0x152fa7fb5fff 0x152fa7fb6000 - 0x152fa7fb6fff 0x56324c801000 - 0x56324c8f1fff 0x56324c8f2000 - 0x56324c9fbfff 0x56324c9fc000 - 0x56324ca5bfff 0x56324ca5d000 - 0x56324ca8bfff 0x56324ca8c000 - 0x56324cabcfff 0x56324cabd000 - 0x56324cac0fff 0x56324dfd3000 - 0x56324dff3fff 0x7fffc8529000 - 0x7fffc8549fff 0x7fffc855f000 - 0x7fffc8562fff 0x7fffc8563000 - 0x7fffc8564fff