Разбить слова по слогам - 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
маша ела кашу) ->ма-ша е-ла ка-шу