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

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

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

Добрый день, есть такое задание. Дана фраза русского языка. Написать программу, которая разбивает каждое слово фразы на слоги. Нашла код:
(setq glasn '(а е ё и о у ы э ю я))
 
(defun is_glasn (chr lst_glasn)
     ((null lst_glasn) nil)
     ((equal chr (car lst_glasn)) T)
     (is_glasn chr (cdr lst_glasn))
)
 
(defun ins (s)
      ((is_glasn s glasn) (pack (list s '-)))
      s
)
 
(defun divide_word (word)
      ((null word) nil)
      (cons (ins (car word)) (divide_word (cdr word)))
)
 
(defun slogi (txt)
      (mapcar '(lambda (s) (pack (divide_word (unpack s)))) txt)
)
 
(defun razdel (txt)
     (mapcar '(lambda (s) (slogi s)) txt)
)
Но почему то выдает ошибку: 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
Листинг программы
(defun task (txt)
 (let ((g "аеёиоуыэюя")
       (r "")
       (l 0)) 
  (iter (for s in-string txt)
    (setq r (strCat r s))
    (unless (zerop (strInd g s)) (setq r (strCat r "-")))) 
  (setq r (strRep r "- " " ") l (strLen r)) 
  (when (eq (strRight r 1) "-") (setq r (strLeft r (- l 1)))) r))
 
==> TASK
 
(task "мама мыла раму")
 
==> "ма-ма мы-ла ра-му"
 
(task "маша ела кашу")
 
==> "ма-ша е-ла ка-шу"

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

В этом коде:

  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
Похожие ответы