fork download
  1. ;; Гласные буквы русского языка
  2. (defun vowel-p (char)
  3. (member char '(#\а #\е #\ё #\и #\о #\у #\ы #\э #\ю #\я
  4. #\А #\Е #\Ё #\И #\О #\У #\Ы #\Э #\Ю #\Я)
  5. :test #'char=))
  6.  
  7. ;; Разбиение слова на слоги по правилам русского языка
  8. (defun split-word (word)
  9. (let ((chars (coerce word 'list))
  10. (syllables nil)
  11. (current nil))
  12. (dolist (ch chars)
  13. (push ch current)
  14. (when (vowel-p ch)
  15. (push (coerce (reverse current) 'string) syllables)
  16. (setf current nil)))
  17. (when current
  18. (if syllables
  19. (setf (car syllables)
  20. (concatenate 'string (car syllables)
  21. (coerce (reverse current) 'string)))
  22. (push (coerce (reverse current) 'string) syllables)))
  23. (reverse syllables)))
  24.  
  25. ;; Разбиение строки на слова
  26. (defun split-string (str)
  27. (let ((words nil) (current nil))
  28. (dotimes (i (length str))
  29. (let ((ch (char str i)))
  30. (if (char= ch #\Space)
  31. (when current
  32. (push (coerce (reverse current) 'string) words)
  33. (setf current nil))
  34. (push ch current))))
  35. (when current
  36. (push (coerce (reverse current) 'string) words))
  37. (reverse words)))
  38.  
  39. ;; Главная функция с использованием MAPCAR
  40. (defun split-phrase (phrase)
  41. (mapcar #'split-word (split-string phrase)))
  42.  
  43. ;; Тест
  44. (print (split-phrase "написать программу "))
  45.  
  46.  
Success #stdin #stdout 0.01s 29284KB
stdin
Standard input is empty
stdout
(("на" "пи" "сать") ("про" "гра" "мму"))