Разбить слова по слогам - Lisp

Узнай цену своей работы

Формулировка задачи:

Добрый день, есть такое задание. Дана фраза русского языка. Написать программу, которая разбивает каждое слово фразы на слоги. Нашла код:
Листинг программы
  1. (setq glasn '(а е ё и о у ы э ю я))
  2. (defun is_glasn (chr lst_glasn)
  3. ((null lst_glasn) nil)
  4. ((equal chr (car lst_glasn)) T)
  5. (is_glasn chr (cdr lst_glasn))
  6. )
  7. (defun ins (s)
  8. ((is_glasn s glasn) (pack (list s '-)))
  9. s
  10. )
  11. (defun divide_word (word)
  12. ((null word) nil)
  13. (cons (ins (car word)) (divide_word (cdr word)))
  14. )
  15. (defun slogi (txt)
  16. (mapcar '(lambda (s) (pack (divide_word (unpack s)))) txt)
  17. )
  18. (defun razdel (txt)
  19. (mapcar '(lambda (s) (slogi s)) txt)
  20. )
Но почему то выдает ошибку: Error: Argument to apply/funcall is not a function: (LAMBDA (S) (SLOGI S)). 1 (continue) Try calling a different function instead of (LAMBDA (S) (SLOGI S)) with the same arguments. 2 (abort) Return to level 0. 3 Return to top loop level 0. Type :b for backtrace or :c <option number> to proceed. Type :bug-form "<subject>" for a bug report template or :? for other options.

Решение задачи: «Разбить слова по слогам»

textual
Листинг программы
  1. (defun task (txt)
  2.  (let ((g "аеёиоуыэюя")
  3.        (r "")
  4.        (l 0))
  5.   (iter (for s in-string txt)
  6.     (setq r (strCat r s))
  7.     (unless (zerop (strInd g s)) (setq r (strCat r "-"))))
  8.   (setq r (strRep r "- " " ") l (strLen r))
  9.   (when (eq (strRight r 1) "-") (setq r (strLeft r (- l 1)))) r))
  10.  
  11. ==> TASK
  12.  
  13. (task "мама мыла раму")
  14.  
  15. ==> "ма-ма мы-ла ра-му"
  16.  
  17. (task "маша ела кашу")
  18.  
  19. ==> "ма-ша е-ла ка-шу"

Объяснение кода листинга программы

В этом коде:

  1. Создаётся функция task, которая принимает в качестве аргумента строку txt.
  2. В функции используется let для создания трёх переменных: g, r и l.
  3. Переменная g получает значение аеёиоуыэюя.
  4. Переменная r получает значение пустой строки.
  5. Переменная l получает значение 0.
  6. Используется iter, чтобы пройти по каждому символу в строке txt.
  7. Для каждого символа добавляется его значение к переменной r.
  8. Если текущий символ не является первым символом в переменной g, то к переменной r добавляется дефис.
  9. После прохода по всем символам в txt, удаляются пробелы в начале и в конце переменной r.
  10. Если последний символ в r является дефисом, то удаляются последний символ в r и возвращается r.
  11. Возвращается значение r. Примеры использования функции:
  12. (task мама мыла раму) -> ма-ма мы-ла ра-му
  13. (task маша ела кашу) -> ма-ша е-ла ка-шу

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы