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 (< index (1- (length chars)))
  14. (char= (elt chars (1+ index)) #\й)
  15. (vowel-p (elt chars index))))
  16.  
  17. ;; Функция для проверки наличия удвоенной согласной после гласной
  18. (defun double-consonant-after-vowel-p (chars index)
  19. (and (< index (1- (length chars)))
  20. (consonant-p (elt chars (1+ index)))
  21. (char= (elt chars index) (elt chars (1+ index)))))
  22.  
  23. ;; Разбиение слова на слоги по правилам русского языка (улучшенная версия)
  24. (defun split-word (word)
  25. (let ((chars (coerce word 'list))
  26. (syllables nil)
  27. (current nil)
  28. (i 0))
  29. (loop while (< i (length chars))
  30. do (let ((ch (elt chars i)))
  31. (push ch current)
  32. (cond
  33. ((vowel-p ch)
  34. ;Проверка на "й" после гласной
  35. (if (yot-after-vowel-p chars i)
  36. (progn
  37. (push (elt chars (incf i)) current) ;включить "й" в текущий слог
  38. (push (coerce (reverse current) 'string) syllables)
  39. (setf current nil))
  40. ; Проверка на удвоенную согласную после гласной
  41. (if (double-consonant-after-vowel-p chars i)
  42. (progn
  43. (push (coerce (reverse current) 'string) syllables) ;закончить слог с гласной
  44. (setf syllables (cons (string (elt chars (incf i))) syllables)) ; Создать новый слог с согласной и добавить его
  45. (setf current nil)
  46. )
  47. (progn
  48. (push (coerce (reverse current) 'string) syllables)
  49. (setf current nil))))
  50. )
  51. (t nil)) ;просто продолжаем, если это не гласная
  52.  
  53. (incf i))) ;перейти к следующему символу
  54.  
  55. (when current ;Обработка остатка в конце слова
  56. (if syllables
  57. (setf (car syllables)
  58. (concatenate 'string (car syllables) (coerce (reverse current) 'string)))
  59. (push (coerce (reverse current) 'string) syllables)))
  60. (reverse syllables)))
  61.  
  62. ;; Разбиение строки на слова
  63. (defun split-string (str)
  64. (let ((words nil) (current nil))
  65. (dotimes (i (length str))
  66. (let ((ch (char str i)))
  67. (if (char= ch #\Space)
  68. (when current
  69. (push (coerce (reverse current) 'string) words)
  70. (setf current nil))
  71. (push ch current))))
  72. (when current
  73. (push (coerce (reverse current) 'string) words))
  74. (reverse words)))
  75.  
  76. ;; Главная функция с использованием MAPCAR
  77. (defun split-phrase (phrase)
  78. (mapcar #'split-word (split-string phrase))) ; Using MAPCAR
  79.  
  80. ;; Тест
  81. (print (split-phrase "написать программу "))
  82. (print (split-phrase "дана фраза на русском языке "))
  83. (print (split-phrase "война, мир, эвакуатор "))
  84. (print (split-phrase "скамейка "))
  85. (print (split-phrase "ванна"))
  86. (print (split-phrase "коллекция"))
  87. (print (split-phrase "длинный"))
  88. (print (split-phrase "касса"))
  89. (print (split-phrase "ван-на"))
  90.  
Success #stdin #stdout #stderr 0.02s 9724KB
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
  0x14a835a00000 - 0x14a835ce4fff
  0x14a835e00000 - 0x14a835e02fff
  0x14a835e03000 - 0x14a836001fff
  0x14a836002000 - 0x14a836002fff
  0x14a836003000 - 0x14a836003fff
  0x14a836015000 - 0x14a836039fff
  0x14a83603a000 - 0x14a8361acfff
  0x14a8361ad000 - 0x14a8361f5fff
  0x14a8361f6000 - 0x14a8361f8fff
  0x14a8361f9000 - 0x14a8361fbfff
  0x14a8361fc000 - 0x14a8361fffff
  0x14a836200000 - 0x14a836203fff
  0x14a836204000 - 0x14a836403fff
  0x14a836404000 - 0x14a836404fff
  0x14a836405000 - 0x14a836405fff
  0x14a83643f000 - 0x14a836440fff
  0x14a836441000 - 0x14a836450fff
  0x14a836451000 - 0x14a836484fff
  0x14a836485000 - 0x14a8365bbfff
  0x14a8365bc000 - 0x14a8365bcfff
  0x14a8365bd000 - 0x14a8365bffff
  0x14a8365c0000 - 0x14a8365c0fff
  0x14a8365c1000 - 0x14a8365c2fff
  0x14a8365c3000 - 0x14a8365c3fff
  0x14a8365c4000 - 0x14a8365c5fff
  0x14a8365c6000 - 0x14a8365c6fff
  0x14a8365c7000 - 0x14a8365c7fff
  0x14a8365c8000 - 0x14a8365c8fff
  0x14a8365c9000 - 0x14a8365d6fff
  0x14a8365d7000 - 0x14a8365e4fff
  0x14a8365e5000 - 0x14a8365f1fff
  0x14a8365f2000 - 0x14a8365f5fff
  0x14a8365f6000 - 0x14a8365f6fff
  0x14a8365f7000 - 0x14a8365f7fff
  0x14a8365f8000 - 0x14a8365fdfff
  0x14a8365fe000 - 0x14a8365fffff
  0x14a836600000 - 0x14a836600fff
  0x14a836601000 - 0x14a836601fff
  0x14a836602000 - 0x14a836602fff
  0x14a836603000 - 0x14a836630fff
  0x14a836631000 - 0x14a83663ffff
  0x14a836640000 - 0x14a8366e5fff
  0x14a8366e6000 - 0x14a83677cfff
  0x14a83677d000 - 0x14a83677dfff
  0x14a83677e000 - 0x14a83677efff
  0x14a83677f000 - 0x14a836792fff
  0x14a836793000 - 0x14a8367bafff
  0x14a8367bb000 - 0x14a8367c4fff
  0x14a8367c5000 - 0x14a8367c6fff
  0x14a8367c7000 - 0x14a8367ccfff
  0x14a8367cd000 - 0x14a8367cffff
  0x14a8367d2000 - 0x14a8367d2fff
  0x14a8367d3000 - 0x14a8367d3fff
  0x14a8367d4000 - 0x14a8367d4fff
  0x14a8367d5000 - 0x14a8367d5fff
  0x14a8367d6000 - 0x14a8367d6fff
  0x14a8367d7000 - 0x14a8367ddfff
  0x14a8367de000 - 0x14a8367e0fff
  0x14a8367e1000 - 0x14a8367e1fff
  0x14a8367e2000 - 0x14a836802fff
  0x14a836803000 - 0x14a83680afff
  0x14a83680b000 - 0x14a83680bfff
  0x14a83680c000 - 0x14a83680cfff
  0x14a83680d000 - 0x14a83680dfff
  0x5609a0222000 - 0x5609a0312fff
  0x5609a0313000 - 0x5609a041cfff
  0x5609a041d000 - 0x5609a047cfff
  0x5609a047e000 - 0x5609a04acfff
  0x5609a04ad000 - 0x5609a04ddfff
  0x5609a04de000 - 0x5609a04e1fff
  0x5609a0e92000 - 0x5609a0eb2fff
  0x7ffed509f000 - 0x7ffed50bffff
  0x7ffed510c000 - 0x7ffed510ffff
  0x7ffed5110000 - 0x7ffed5111fff