Разбить слова по слогам - Lisp
Формулировка задачи:
Добрый день, есть такое задание.
Дана фраза русского языка. Написать программу, которая разбивает каждое слово фразы на слоги.
Нашла код:
Но почему то выдает ошибку:
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.
Листинг программы
- (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)
- )
Решение задачи: «Разбить слова по слогам»
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 "маша ела кашу")
- ==> "ма-ша е-ла ка-шу"
Объяснение кода листинга программы
В этом коде:
- Создаётся функция
task
, которая принимает в качестве аргумента строкуtxt
. - В функции используется
let
для создания трёх переменных:g
,r
иl
. - Переменная
g
получает значениеаеёиоуыэюя
. - Переменная
r
получает значение пустой строки. - Переменная
l
получает значение 0. - Используется
iter
, чтобы пройти по каждому символу в строкеtxt
. - Для каждого символа добавляется его значение к переменной
r
. - Если текущий символ не является первым символом в переменной
g
, то к переменнойr
добавляется дефис. - После прохода по всем символам в
txt
, удаляются пробелы в начале и в конце переменнойr
. - Если последний символ в
r
является дефисом, то удаляются последний символ вr
и возвращаетсяr
. - Возвращается значение
r
. Примеры использования функции: - (task
мама мыла раму
) ->ма-ма мы-ла ра-му
- (task
маша ела кашу
) ->ма-ша е-ла ка-шу
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д