fork download
  1. ;; Гласные буквы русского языка
  2. (defun vowel-p (char)
  3. (member char '(#\а #\е #\ё #\и #\о #\у #\ы #\э #\ю #\я
  4. #\А #\Е #\Ё #\И #\О #\У #\Ы #\Э #\Ю #\Я)
  5. :test #'char=))
  6.  
  7. ;; Согласные буквы русского языка
  8. (defun consonant-p (char)
  9. (not (vowel-p char)))
  10.  
  11. ;; Функция для проверки наличия "й" после гласной
  12. (defun yot-after-vowel-p (chars index)
  13. (and (< (1+ index) (length chars))
  14. (char= (elt chars (1+ index)) #\й)
  15. (vowel-p (elt chars index))))
  16.  
  17.  
  18. ;; Разбиение слова на слоги по правилам русского языка (рекурсивная версия без SETF)
  19. (defun split-word (word)
  20. (labels ((split-word-recursive (chars syllables current i)
  21. (cond
  22. ((>= i (length chars)) ; Базовый случай: конец слова
  23. (if current
  24. (reverse (cons (coerce (reverse current) 'string) syllables))
  25. (reverse syllables)))
  26. (t
  27. (let ((ch (elt chars i)))
  28. (cond
  29. ((vowel-p ch)
  30. (if (yot-after-vowel-p chars i)
  31. (split-word-recursive chars
  32. (cons (coerce (reverse (cons (elt chars (1+ i)) current)) 'string) syllables)
  33. nil
  34. (+ i 2))
  35. (split-word-recursive chars
  36. (cons (coerce (reverse (cons ch current)) 'string) syllables)
  37. nil
  38. (1+ i))))
  39. (t
  40. (split-word-recursive chars
  41. syllables
  42. (cons ch current)
  43. (1+ i))))))))) ; Закрывающая скобка для let
  44. (split-word-recursive (coerce word 'list) nil nil 0)))
  45.  
  46. ;; Разбиение строки на слова (рекурсивная версия без SETF)
  47. (defun split-string (str)
  48. (labels ((split-string-recursive (str current-word words)
  49. (cond
  50. ((null str) ; Базовый случай: достигли конца строки
  51. (if current-word
  52. (reverse (cons (coerce (reverse current-word) 'string) words)) ; Добавляем последнее слово и возвращаем
  53. (reverse words))) ; Возвращаем накопленные слова
  54. ((char= (car str) #\Space) ; Разделитель - пробел
  55. (if current-word
  56. (split-string-recursive (cdr str) nil (cons (coerce (reverse current-word) 'string) words)) ; Добавляем слово, начинаем новое
  57. (split-string-recursive (cdr str) nil words))) ; Пропускаем пробел
  58. (t ; Добавляем символ к текущему слову
  59. (split-string-recursive (cdr str) (cons (car str) current-word) words))))) ; Рекурсивный вызов
  60. (split-string-recursive (coerce str 'list) nil nil))) ; Запускаем рекурсию
  61.  
  62.  
  63. ;; Главная функция с использованием MAPCAR
  64. (defun split-phrase (phrase)
  65. (mapcar #'split-word (split-string phrase))) ; Using MAPCAR
  66.  
  67. ;; Тест
  68. (print (split-phrase "написать программу"))
  69. (print (split-phrase "дана фраза на русском языке"))
  70. (print (split-phrase "война, мир, эвакуатор"))
  71. (print (split-phrase "скамейка"))
  72. (print (split-phrase "ванна"))
  73. (print (split-phrase "коллекция"))
  74. (print (split-phrase "чай"))
Success #stdin #stdout #stderr 0.02s 9736KB
stdin
Standard input is empty
stdout
(("на" "пи" "са" "ть") ("про" "гра" "мму")) 
(("да" "на") ("фра" "за") ("на") ("ру" "сско" "м") ("я" "зы" "ке")) 
(("вй" "на" ",") ("ми" "р,") ("э" "ва" "ку" "а" "то" "р")) 
(("ска" "мй" "ка")) 
(("ва" "нна")) 
(("ко" "лле" "кци" "я")) 
(("чй")) 
stderr
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