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. ;; Разбиение слова на слоги по правилам русского языка
  19. (defun split-word (word)
  20. (let ((chars (coerce word 'list))
  21. (syllables nil)
  22. (current nil)
  23. (i 0))
  24. (loop while (< i (length chars))
  25. do (let ((ch (elt chars i)))
  26. (push ch current)
  27. (cond
  28. ((vowel-p ch)
  29. ;; Проверка на "й" после гласной
  30. (if (yot-after-vowel-p chars i)
  31. (progn
  32. (incf i)
  33. (push (elt chars i) current) ; Включаем "й" в текущий слог
  34. (push (coerce (reverse current) 'string) syllables)
  35. (setf current nil))
  36. (progn
  37. (push (coerce (reverse current) 'string) syllables)
  38. (setf current nil)))
  39.  
  40. )
  41. (t nil))
  42.  
  43. (incf i)))
  44.  
  45. (when current
  46. (if syllables
  47. (setf (car syllables)
  48. (concatenate 'string (car syllables) (coerce (reverse current) 'string)))
  49. (push (coerce (reverse current) 'string) syllables)))
  50. (reverse syllables)))
  51.  
  52. ;; Разбиение строки на слова
  53. (defun split-string (str)
  54. (let ((words nil) (current nil))
  55. (dotimes (i (length str))
  56. (let ((ch (char str i)))
  57. (if (char= ch #\Space)
  58. (when current
  59. (push (coerce (reverse current) 'string) words)
  60. (setf current nil))
  61. (push ch current))))
  62. (when current
  63. (push (coerce (reverse current) 'string) words))
  64. (reverse words)))
  65.  
  66. ;; Главная функция с использованием MAPCAR
  67. (defun split-phrase (phrase)
  68. (mapcar #'split-word (split-string phrase))) ; Using MAPCAR
  69.  
  70. ;; Тест
  71. (print (split-phrase "написать программу"))
  72. (print (split-phrase "дана фраза на русском языке"))
  73. (print (split-phrase "война, мир, эвакуатор"))
  74. (print (split-phrase "скамейка"))
  75. (print (split-phrase "ванна"))
  76. (print (split-phrase "коллекция"))
  77. (print (split-phrase "чай"))
Success #stdin #stdout #stderr 0.02s 9768KB
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
  0x150c86c00000 - 0x150c86ee4fff
  0x150c87015000 - 0x150c87039fff
  0x150c8703a000 - 0x150c871acfff
  0x150c871ad000 - 0x150c871f5fff
  0x150c871f6000 - 0x150c871f8fff
  0x150c871f9000 - 0x150c871fbfff
  0x150c871fc000 - 0x150c871fffff
  0x150c87200000 - 0x150c87202fff
  0x150c87203000 - 0x150c87401fff
  0x150c87402000 - 0x150c87402fff
  0x150c87403000 - 0x150c87403fff
  0x150c87480000 - 0x150c8748ffff
  0x150c87490000 - 0x150c874c3fff
  0x150c874c4000 - 0x150c875fafff
  0x150c875fb000 - 0x150c875fbfff
  0x150c875fc000 - 0x150c875fefff
  0x150c875ff000 - 0x150c875fffff
  0x150c87600000 - 0x150c87603fff
  0x150c87604000 - 0x150c87803fff
  0x150c87804000 - 0x150c87804fff
  0x150c87805000 - 0x150c87805fff
  0x150c87920000 - 0x150c87923fff
  0x150c87924000 - 0x150c87924fff
  0x150c87925000 - 0x150c87926fff
  0x150c87927000 - 0x150c87927fff
  0x150c87928000 - 0x150c87928fff
  0x150c87929000 - 0x150c87929fff
  0x150c8792a000 - 0x150c87937fff
  0x150c87938000 - 0x150c87945fff
  0x150c87946000 - 0x150c87952fff
  0x150c87953000 - 0x150c87956fff
  0x150c87957000 - 0x150c87957fff
  0x150c87958000 - 0x150c87958fff
  0x150c87959000 - 0x150c8795efff
  0x150c8795f000 - 0x150c87960fff
  0x150c87961000 - 0x150c87961fff
  0x150c87962000 - 0x150c87962fff
  0x150c87963000 - 0x150c87963fff
  0x150c87964000 - 0x150c87991fff
  0x150c87992000 - 0x150c879a0fff
  0x150c879a1000 - 0x150c87a46fff
  0x150c87a47000 - 0x150c87addfff
  0x150c87ade000 - 0x150c87adefff
  0x150c87adf000 - 0x150c87adffff
  0x150c87ae0000 - 0x150c87af3fff
  0x150c87af4000 - 0x150c87b1bfff
  0x150c87b1c000 - 0x150c87b25fff
  0x150c87b26000 - 0x150c87b27fff
  0x150c87b28000 - 0x150c87b2dfff
  0x150c87b2e000 - 0x150c87b30fff
  0x150c87b33000 - 0x150c87b33fff
  0x150c87b34000 - 0x150c87b34fff
  0x150c87b35000 - 0x150c87b35fff
  0x150c87b36000 - 0x150c87b36fff
  0x150c87b37000 - 0x150c87b37fff
  0x150c87b38000 - 0x150c87b3efff
  0x150c87b3f000 - 0x150c87b41fff
  0x150c87b42000 - 0x150c87b42fff
  0x150c87b43000 - 0x150c87b63fff
  0x150c87b64000 - 0x150c87b6bfff
  0x150c87b6c000 - 0x150c87b6cfff
  0x150c87b6d000 - 0x150c87b6dfff
  0x150c87b6e000 - 0x150c87b6efff
  0x560696dd1000 - 0x560696ec1fff
  0x560696ec2000 - 0x560696fcbfff
  0x560696fcc000 - 0x56069702bfff
  0x56069702d000 - 0x56069705bfff
  0x56069705c000 - 0x56069708cfff
  0x56069708d000 - 0x560697090fff
  0x5606973c2000 - 0x5606973e2fff
  0x7ffe6f9a7000 - 0x7ffe6f9c7fff
  0x7ffe6f9e2000 - 0x7ffe6f9e5fff
  0x7ffe6f9e6000 - 0x7ffe6f9e7fff