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. ;; Разбиение слова на слоги по правилам русского языка (рекурсивная версия без SETF)
  18. (defun split-word (word)
  19. (labels ((split-word-recursive (chars syllables current i)
  20. (cond
  21. ((>= i (length chars))
  22. (if current
  23. (reverse (cons (coerce (reverse current) 'string) syllables))
  24. (reverse syllables)))
  25. (t
  26. (let ((ch (elt chars i)))
  27. (cond
  28. ((vowel-p ch)
  29. (if (yot-after-vowel-p chars i)
  30. (let ((next-char (elt chars (1+ i))))
  31. (let ((new-current (append current (list ch next-char))))
  32. (split-word-recursive chars
  33. (cons (coerce (reverse new-current) 'string) syllables)
  34. nil
  35. (+ i 2))))
  36. (split-word-recursive chars
  37. (cons (coerce (reverse (cons ch current)) 'string) syllables)
  38. nil
  39. (1+ i))))
  40. (t
  41. (split-word-recursive chars
  42. syllables
  43. (cons ch current)
  44. (1+ i)))))))))
  45. (split-word-recursive (coerce word 'list) nil nil 0)))
  46.  
  47. ;; Разбиение строки на слова (рекурсивная версия без SETF)
  48. (defun split-string (str)
  49. (labels ((split-string-recursive (str current-word words)
  50. (cond
  51. ((null str)
  52. (if current-word
  53. (reverse (cons (coerce (reverse current-word) 'string) words))
  54. (reverse words)))
  55. ((char= (car str) #\Space)
  56. (if current-word
  57. (split-string-recursive (cdr str) nil (cons (coerce (reverse current-word) 'string) words))
  58. (split-string-recursive (cdr str) nil words)))
  59. (t
  60. (split-string-recursive (cdr str) (cons (car str) current-word) words)))))
  61. (split-string-recursive (coerce str 'list) nil nil)))
  62.  
  63. ;; Главная функция с использованием MAPCAR
  64. (defun split-phrase (phrase)
  65. (mapcar #'split-word (split-string phrase)))
  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 9632KB
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
  0x155542600000 - 0x1555428e4fff
  0x155542a15000 - 0x155542a39fff
  0x155542a3a000 - 0x155542bacfff
  0x155542bad000 - 0x155542bf5fff
  0x155542bf6000 - 0x155542bf8fff
  0x155542bf9000 - 0x155542bfbfff
  0x155542bfc000 - 0x155542bfffff
  0x155542c00000 - 0x155542c02fff
  0x155542c03000 - 0x155542e01fff
  0x155542e02000 - 0x155542e02fff
  0x155542e03000 - 0x155542e03fff
  0x155542e80000 - 0x155542e8ffff
  0x155542e90000 - 0x155542ec3fff
  0x155542ec4000 - 0x155542ffafff
  0x155542ffb000 - 0x155542ffbfff
  0x155542ffc000 - 0x155542ffefff
  0x155542fff000 - 0x155542ffffff
  0x155543000000 - 0x155543003fff
  0x155543004000 - 0x155543203fff
  0x155543204000 - 0x155543204fff
  0x155543205000 - 0x155543205fff
  0x155543336000 - 0x155543339fff
  0x15554333a000 - 0x15554333afff
  0x15554333b000 - 0x15554333cfff
  0x15554333d000 - 0x15554333dfff
  0x15554333e000 - 0x15554333efff
  0x15554333f000 - 0x15554333ffff
  0x155543340000 - 0x15554334dfff
  0x15554334e000 - 0x15554335bfff
  0x15554335c000 - 0x155543368fff
  0x155543369000 - 0x15554336cfff
  0x15554336d000 - 0x15554336dfff
  0x15554336e000 - 0x15554336efff
  0x15554336f000 - 0x155543374fff
  0x155543375000 - 0x155543376fff
  0x155543377000 - 0x155543377fff
  0x155543378000 - 0x155543378fff
  0x155543379000 - 0x155543379fff
  0x15554337a000 - 0x1555433a7fff
  0x1555433a8000 - 0x1555433b6fff
  0x1555433b7000 - 0x15554345cfff
  0x15554345d000 - 0x1555434f3fff
  0x1555434f4000 - 0x1555434f4fff
  0x1555434f5000 - 0x1555434f5fff
  0x1555434f6000 - 0x155543509fff
  0x15554350a000 - 0x155543531fff
  0x155543532000 - 0x15554353bfff
  0x15554353c000 - 0x15554353dfff
  0x15554353e000 - 0x155543543fff
  0x155543544000 - 0x155543546fff
  0x155543549000 - 0x155543549fff
  0x15554354a000 - 0x15554354afff
  0x15554354b000 - 0x15554354bfff
  0x15554354c000 - 0x15554354cfff
  0x15554354d000 - 0x15554354dfff
  0x15554354e000 - 0x155543554fff
  0x155543555000 - 0x155543557fff
  0x155543558000 - 0x155543558fff
  0x155543559000 - 0x155543579fff
  0x15554357a000 - 0x155543581fff
  0x155543582000 - 0x155543582fff
  0x155543583000 - 0x155543583fff
  0x155543584000 - 0x155543584fff
  0x55af0409e000 - 0x55af0418efff
  0x55af0418f000 - 0x55af04298fff
  0x55af04299000 - 0x55af042f8fff
  0x55af042fa000 - 0x55af04328fff
  0x55af04329000 - 0x55af04359fff
  0x55af0435a000 - 0x55af0435dfff
  0x55af05b8f000 - 0x55af05baffff
  0x7ffc3288e000 - 0x7ffc328aefff
  0x7ffc329a6000 - 0x7ffc329a9fff
  0x7ffc329aa000 - 0x7ffc329abfff