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 ((process-syllable (chars syllables current index)
  20. (cond
  21. ((>= index (length chars))
  22. (if current
  23. (let ((new-syllable (coerce (reverse current) 'string)))
  24. (cond
  25. (syllables (cons (concatenate 'string (car syllables) new-syllable) (cdr syllables)))
  26. (t (list new-syllable))))
  27. syllables))
  28. ((vowel-p (elt chars index))
  29. (if (yot-after-vowel-p chars index)
  30. (let ((new-syllable (coerce (reverse (cons (elt chars index) (cons (elt chars (+ 1 index)) current))) 'string)))
  31. (process-syllable (subseq chars (+ 2 index)) (cons new-syllable syllables) nil 0))
  32. (let ((new-syllable (coerce (reverse (cons (elt chars index) current)) 'string)))
  33. (process-syllable (subseq chars (+ 1 index)) (cons new-syllable syllables) nil 0))))
  34. (t (process-syllable chars syllables (cons (elt chars index) current) (+ 1 index))))))
  35. (reverse (process-syllable (coerce word 'list) nil nil 0))))
  36.  
  37.  
  38. ;; Разбиение строки на слова (без SETF)
  39. (defun split-string (str)
  40. (labels ((process-string (string words current index)
  41. (cond ((>= index (length string))
  42. (if current
  43. (cons (coerce (reverse current) 'string) words)
  44. words))
  45. ((char= (char string index) #\Space)
  46. (if current
  47. (process-string string (cons (coerce (reverse current) 'string) words) nil (+ 1 index))
  48. (process-string string words nil (+ 1 index))))
  49. (t (process-string string words (cons (char string index) current) (+ 1 index))))))
  50. (reverse (process-string str nil nil 0))))
  51.  
  52. ;; Главная функция с использованием MAPCAR
  53. (defun split-phrase (phrase)
  54. (mapcar #'split-word (split-string phrase))) ; Using MAPCAR
  55.  
  56. ;; Тест
  57. (print (split-phrase "написать программу"))
  58. (print (split-phrase "дана фраза на русском языке"))
  59. (print (split-phrase "война, мир, эвакуатор"))
  60. (print (split-phrase "скамейка"))
  61. (print (split-phrase "ванна"))
  62. (print (split-phrase "коллекция"))
  63. (print (split-phrase "чай"))
  64. (print (split-phrase "ёлка"))
Success #stdin #stdout #stderr 0.02s 9596KB
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
  0x152fa7000000 - 0x152fa72e4fff
  0x152fa7415000 - 0x152fa7439fff
  0x152fa743a000 - 0x152fa75acfff
  0x152fa75ad000 - 0x152fa75f5fff
  0x152fa75f6000 - 0x152fa75f8fff
  0x152fa75f9000 - 0x152fa75fbfff
  0x152fa75fc000 - 0x152fa75fffff
  0x152fa7600000 - 0x152fa7602fff
  0x152fa7603000 - 0x152fa7801fff
  0x152fa7802000 - 0x152fa7802fff
  0x152fa7803000 - 0x152fa7803fff
  0x152fa7880000 - 0x152fa788ffff
  0x152fa7890000 - 0x152fa78c3fff
  0x152fa78c4000 - 0x152fa79fafff
  0x152fa79fb000 - 0x152fa79fbfff
  0x152fa79fc000 - 0x152fa79fefff
  0x152fa79ff000 - 0x152fa79fffff
  0x152fa7a00000 - 0x152fa7a03fff
  0x152fa7a04000 - 0x152fa7c03fff
  0x152fa7c04000 - 0x152fa7c04fff
  0x152fa7c05000 - 0x152fa7c05fff
  0x152fa7d68000 - 0x152fa7d6bfff
  0x152fa7d6c000 - 0x152fa7d6cfff
  0x152fa7d6d000 - 0x152fa7d6efff
  0x152fa7d6f000 - 0x152fa7d6ffff
  0x152fa7d70000 - 0x152fa7d70fff
  0x152fa7d71000 - 0x152fa7d71fff
  0x152fa7d72000 - 0x152fa7d7ffff
  0x152fa7d80000 - 0x152fa7d8dfff
  0x152fa7d8e000 - 0x152fa7d9afff
  0x152fa7d9b000 - 0x152fa7d9efff
  0x152fa7d9f000 - 0x152fa7d9ffff
  0x152fa7da0000 - 0x152fa7da0fff
  0x152fa7da1000 - 0x152fa7da6fff
  0x152fa7da7000 - 0x152fa7da8fff
  0x152fa7da9000 - 0x152fa7da9fff
  0x152fa7daa000 - 0x152fa7daafff
  0x152fa7dab000 - 0x152fa7dabfff
  0x152fa7dac000 - 0x152fa7dd9fff
  0x152fa7dda000 - 0x152fa7de8fff
  0x152fa7de9000 - 0x152fa7e8efff
  0x152fa7e8f000 - 0x152fa7f25fff
  0x152fa7f26000 - 0x152fa7f26fff
  0x152fa7f27000 - 0x152fa7f27fff
  0x152fa7f28000 - 0x152fa7f3bfff
  0x152fa7f3c000 - 0x152fa7f63fff
  0x152fa7f64000 - 0x152fa7f6dfff
  0x152fa7f6e000 - 0x152fa7f6ffff
  0x152fa7f70000 - 0x152fa7f75fff
  0x152fa7f76000 - 0x152fa7f78fff
  0x152fa7f7b000 - 0x152fa7f7bfff
  0x152fa7f7c000 - 0x152fa7f7cfff
  0x152fa7f7d000 - 0x152fa7f7dfff
  0x152fa7f7e000 - 0x152fa7f7efff
  0x152fa7f7f000 - 0x152fa7f7ffff
  0x152fa7f80000 - 0x152fa7f86fff
  0x152fa7f87000 - 0x152fa7f89fff
  0x152fa7f8a000 - 0x152fa7f8afff
  0x152fa7f8b000 - 0x152fa7fabfff
  0x152fa7fac000 - 0x152fa7fb3fff
  0x152fa7fb4000 - 0x152fa7fb4fff
  0x152fa7fb5000 - 0x152fa7fb5fff
  0x152fa7fb6000 - 0x152fa7fb6fff
  0x56324c801000 - 0x56324c8f1fff
  0x56324c8f2000 - 0x56324c9fbfff
  0x56324c9fc000 - 0x56324ca5bfff
  0x56324ca5d000 - 0x56324ca8bfff
  0x56324ca8c000 - 0x56324cabcfff
  0x56324cabd000 - 0x56324cac0fff
  0x56324dfd3000 - 0x56324dff3fff
  0x7fffc8529000 - 0x7fffc8549fff
  0x7fffc855f000 - 0x7fffc8562fff
  0x7fffc8563000 - 0x7fffc8564fff