;; Глобальные константы (defconstant +glasn+ '(#\А #\Е #\Ё #\И #\О #\У #\Ы #\Э #\Ю #\Я #\а #\е #\ё #\и #\о #\у #\ы #\э #\ю #\я) "Список гласных букв") (defconstant +sonorn+ '(#\Л #\М #\Н #\Р #\л #\м #\н #\р #\Й #\й) "Список сонорных согласных букв") ;;; Проверка гласной (defun glasn (char) (member char +glasn+ :test #'char-equal)) ;;; Проверка сонорного согласного (defun sonorn (char) (member char +sonorn+ :test #'char-equal)) ;;; Проверка шумного согласного (не гласная и не сонорная) (defun shumn (char) (and (characterp char) (not (glasn char)) (not (sonorn char)))) ;;; Разбиение слова на слоги (упрощённый и исправленный вариант) (defun razbit-na-slogi (word) (let ((slogi '()) (current-slog '())) (labels ((add-slog () (when current-slog (push (coerce (nreverse current-slog) 'string) slogi) (setf current-slog '())))) (dotimes (i (length word)) (let ((char (char word i))) (push char current-slog) (when (glasn char) (if (<= (length current-slog) 1) (add-slog) (let* ((rev-slog (reverse current-slog)) (last1 (nth 0 rev-slog)) ; последний символ (гласная) (last2 (nth 1 rev-slog))) ; предпоследний символ (cond ;; Два шумных подряд - последний переходит в следующий слог ((and (shumn last1) (shumn last2)) (push last1 rev-slog) ;; возвращаем последний назад (setf current-slog (list last1)) (add-slog)) ;; Два сонорных подряд, кроме 'й' - последний переходит в следующий слог ((and (sonorn last1) (sonorn last2) (not (char-equal last1 #\й))) (push last1 rev-slog) (setf current-slog (list last1)) (add-slog)) ;; Иначе разделяем здесь (t (add-slog)))))))) ;; Добавляем последний слог, если остался (when current-slog (push (coerce (nreverse current-slog) 'string) slogi)) ;; Возвращаем слоги в правильном порядке (nreverse slogi)))) ;;; Примеры использования (print (list "здравствуй" (razbit-na-slogi "здравствуй"))) (print (list "школа" (razbit-na-slogi "школа"))) (print (list "майка" (razbit-na-slogi "майка"))) (print (list "лампочка" (razbit-na-slogi "лампочка"))) (print (list "космос" (razbit-na-slogi "космос"))) (print (list "алгоритм" (razbit-na-slogi "алгоритм"))) (print (list "интервенция" (razbit-na-slogi "интервенция"))) (print (list "иньекция" (razbit-na-slogi "иньекция")))
Standard input is empty
("здравствуй" ("з" "в" "й"))
("школа" ("ш" "ла"))
("майка" ("ма" "йка"))
("лампочка" ("ла" "мпо" "ч"))
("космос" ("ко" "смо" "с"))
("алгоритм" ("а" "лго" "ри" "тм"))
("интервенция" ("и" "нте" "рве" "нци" "я"))
("иньекция" ("и" "нье" "к" "я"))
Warning: reserving address range 0x80000c0000...0x1fffffffffff that contains memory mappings. clisp might crash later! Memory dump: 0x8000000000 - 0x80000bffff 0x150797600000 - 0x1507978e4fff 0x150797a15000 - 0x150797a39fff 0x150797a3a000 - 0x150797bacfff 0x150797bad000 - 0x150797bf5fff 0x150797bf6000 - 0x150797bf8fff 0x150797bf9000 - 0x150797bfbfff 0x150797bfc000 - 0x150797bfffff 0x150797c00000 - 0x150797c02fff 0x150797c03000 - 0x150797e01fff 0x150797e02000 - 0x150797e02fff 0x150797e03000 - 0x150797e03fff 0x150797e80000 - 0x150797e8ffff 0x150797e90000 - 0x150797ec3fff 0x150797ec4000 - 0x150797ffafff 0x150797ffb000 - 0x150797ffbfff 0x150797ffc000 - 0x150797ffefff 0x150797fff000 - 0x150797ffffff 0x150798000000 - 0x150798003fff 0x150798004000 - 0x150798203fff 0x150798204000 - 0x150798204fff 0x150798205000 - 0x150798205fff 0x15079829c000 - 0x15079829ffff 0x1507982a0000 - 0x1507982a0fff 0x1507982a1000 - 0x1507982a2fff 0x1507982a3000 - 0x1507982a3fff 0x1507982a4000 - 0x1507982a4fff 0x1507982a5000 - 0x1507982a5fff 0x1507982a6000 - 0x1507982b3fff 0x1507982b4000 - 0x1507982c1fff 0x1507982c2000 - 0x1507982cefff 0x1507982cf000 - 0x1507982d2fff 0x1507982d3000 - 0x1507982d3fff 0x1507982d4000 - 0x1507982d4fff 0x1507982d5000 - 0x1507982dafff 0x1507982db000 - 0x1507982dcfff 0x1507982dd000 - 0x1507982ddfff 0x1507982de000 - 0x1507982defff 0x1507982df000 - 0x1507982dffff 0x1507982e0000 - 0x15079830dfff 0x15079830e000 - 0x15079831cfff 0x15079831d000 - 0x1507983c2fff 0x1507983c3000 - 0x150798459fff 0x15079845a000 - 0x15079845afff 0x15079845b000 - 0x15079845bfff 0x15079845c000 - 0x15079846ffff 0x150798470000 - 0x150798497fff 0x150798498000 - 0x1507984a1fff 0x1507984a2000 - 0x1507984a3fff 0x1507984a4000 - 0x1507984a9fff 0x1507984aa000 - 0x1507984acfff 0x1507984af000 - 0x1507984affff 0x1507984b0000 - 0x1507984b0fff 0x1507984b1000 - 0x1507984b1fff 0x1507984b2000 - 0x1507984b2fff 0x1507984b3000 - 0x1507984b3fff 0x1507984b4000 - 0x1507984bafff 0x1507984bb000 - 0x1507984bdfff 0x1507984be000 - 0x1507984befff 0x1507984bf000 - 0x1507984dffff 0x1507984e0000 - 0x1507984e7fff 0x1507984e8000 - 0x1507984e8fff 0x1507984e9000 - 0x1507984e9fff 0x1507984ea000 - 0x1507984eafff 0x55662614f000 - 0x55662623ffff 0x556626240000 - 0x556626349fff 0x55662634a000 - 0x5566263a9fff 0x5566263ab000 - 0x5566263d9fff 0x5566263da000 - 0x55662640afff 0x55662640b000 - 0x55662640efff 0x5566277e6000 - 0x556627806fff 0x7ffe61d4b000 - 0x7ffe61d6bfff 0x7ffe61dd0000 - 0x7ffe61dd3fff 0x7ffe61dd4000 - 0x7ffe61dd5fff