Ошибка в программе - Lisp (229888)
Формулировка задачи:
Здравствуйте.
Я недавно начал изучать Lisp, пробую писать простые программы в Corman Common Lisp.
Я попытался реализовать программу приведения глагольных форм английского языка к инфинитиву
Это программа из учебника, в ней не должно быть ошибок, однако появляется такое сообщение:
";;; An error of type TYPE-ERROR was detected in function SIGNAL-TYPE-ERROR:
;;; Error: Type error: datum = (SETQ (?)), expected type = SYMBOL
;;; Entering Corman Lisp debug loop.
;;; Use :C followed by an option to exit. Type :HELP for help.
;;; Restart options:
;;; 1 Abort to top level.
"
Скажите, пожалуйста, чем вызвана ошибка? Как её можно исправить?
С уважением,
Листинг программы
- (setq плохие-глаголы
- '(
- ("be" ("was" "were") "been" "быть")
- ("become" "became" "become" "стать")
- ("begin" "began" "begun" "начать")
- ("blow" "blew" "blown" "дуть")
- ("break" "broke" "broken" "ломать")
- ("bring" "brought" "brought" "приносить")
- ("build" "built" "built" "строить")
- ("buy" "bought" "bought" "покупать")
- ("catch" "caught" "caught" "ловить")
- ("choose" "chose" "chosen" "выбирать")
- ("come" "came" "come" "приходить")
- ("cost" "cost" "cost" "стоить")
- ("cut" "cut" "cut" "резать")
- ("do" "did" "done" "делать")
- ("draw" "drew" "drawn" "рисовать")
- ("drink" "drank" "drunk" "пить")
- ("drive" "drove" "driven" "водить")
- ("eat" "ate" "eaten" "есть")
- ("fall" "fell" "fallen" "падать")
- ("feel" "felt" "felt" "чувствовать")
- ("fight" "fought" "fought" "бороться")
- ("find" "found" "found" "находить")
- ("fly" "flew" "flown" "летать")
- ("forget" "forgot" "forgotten" "забывать")
- ("forgive" "forgave" "forgiven" "прощать")
- ("get" "got" "got" "получать")
- ("give" "gave" "given" "давать")
- ("go" "went" "gone" "идти")
- ("grow" "grew" "grown" "расти")
- ("have" "had" "had" "иметь")
- ("hear" "heard" "heard" "слышать")
- ("hide" "hid" "hidden" "прятать")
- ("hold" "held" "held" "держать")
- ("keep" "kept" "kept" "хранить")
- ("know" "knew" "known" "знать")
- ("leave" "left" "left" "оставлять")
- ("lend" "lent" "lent" "одалживать")
- ("let" "let" "let" "разрешать")
- ("lose" "lost" "lost" "терять")
- ("make" "made" "made" "делать")
- ("mean" "meant" "meant" "означать")
- ("meet" "met" "met" "встречать")
- ("pay" "paid" "paid" "платить")
- ("put" "put" "put" "класть")
- ("read" "read" "read" "читать")
- ("ring" "rang" "rung" "звонить")
- ("rise" "rose" "risen" "подниматься")
- ("run" "ran" "run" "бежать")
- ("say" "said" "said" "говорить")
- ("see" "saw" "seen" "видеть")
- ("sell" "sold" "sold" "продавать")
- ("send" "sent" "sent" "посылать")
- ("shake" "shook" "shaken" "трясти")
- ("shine" "shone" "shone" "сиять")
- ("show" "showed" "shown" "показывать")
- ("shut" "shut" "shut" "закрывать")
- ("sing" "sang" "sung" "петь")
- ("sit" "sat" "sat" "сидеть")
- ("sleep" "slept" "slept" "спать")
- ("speak" "spoke" "spoken" "говорить")
- ("spend" "spent" "spent" "тратить")
- ("stand" "stood" "stood" "стоять")
- ("stick" "stuck" "stuck" "клеить")
- ("swim" "swam" "swum" "плавать")
- ("take" "took" "taken" "брать")
- ("teach" "taught" "taught" "учить")
- ("tell" "told" "told" "рассказывать")
- ("think" "thought" "thought" "думать")
- ("wake" "woke" "woken" "будить")
- ("wear" "wore" "worn" "носить")
- ("win" "won" "won" "побеждать")
- ("write" "wrote" "written" "писать")
- )
- )
- ;;
- ;; Функции просмотра содержимого списка плохих глаголов
- ;; и выделения инфинитивной формы
- ;;
- (defun просмотр-плохих (глагол список)
- ; формируем временную переменную
- (setq формы (car список))
- ; (prin1 глагол)(princ " - ")(prin1 формы)(terpri)
- (cond
- ((equal глагол (car формы)) глагол) ; это 1 форма
- ((equal глагол (caddr формы)) (car формы)) ; это 3-я форма
- ((equal глагол (cadr формы)) (car формы)) ; это 2-я форма
- ; особый случай - раздвоенная форма was-were
- ((listp (cadr формы))
- (cond
- ((equal глагол (car (cadr формы))) (car формы))
- ((equal глагол (cadr (cadr формы))) (car формы))
- ((> (length список) 0 ) (просмотр-плохих глагол (cdr список)))
- )
- )
- ; список просмотрен, глагол не найден
- ;рекурсивный просмотр всего списка
- ((> (length список) 0 ) (просмотр-плохих глагол (cdr список)))
- (t break)
- )
- )
- (defun плохой? (глагол)
- (просмотр-плохих глагол плохие-глаголы)
- )
- ;;
- ;; в случае правильного глагола отрезаем ему суффикс ed
- ;;
- (defun отрезать-суффикс (строка)
- ; простейшее решение
- (string-right-trim "ed" строка)
- )
- ;;
- ;; выделение инфинитива, если глагольная форма не найдена,
- ;; возвращает исходный глагол с "отрезанным" суффиксом ed
- ;;
- (defun инфинитив (глагол)
- (if (setq результат (плохой? глагол))
- результат
- (отрезать-суффикс глагол)
- )
- )
Решение задачи: «Ошибка в программе»
textual
Листинг программы
- x -> первая-форма?(verb, x)
- или вторая-форма?(verb, x)
- или третья-форма?(verb, x)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д