Запрограммировать интерпретатор ВЫЧИСЛИ, вычисляющий выражение в инфиксной записи - Lisp
Формулировка задачи:
помогите пожалуйста с 2 задачами)
1)Запрограммировать интерпретатор ВЫЧИСЛИ, который преобразует инфиксную запись операций (например, +, -, * и /) выражения в префиксную и возвращает значение выражения. Например:
>(ВЫЧИСЛИ '((-2 + 4) * 3)) 6
Решение задачи: «Запрограммировать интерпретатор ВЫЧИСЛИ, вычисляющий выражение в инфиксной записи»
textual
Листинг программы
(defun atomlist (x) (cond ((null x) nil) ((atom (car x)) (atomlist (cdr x))) (t nil))) (DEFUN inf2pref (x) (PROG (hd tl cc xx rr) (COND ((atomlist x) (RETURN (inf-aux x NIL NIL)))) (SETQ rr NIL) (SETQ xx x) LOOP (SETQ hd (CAR xx)) (SETQ tl (CDR xx)) (COND ((member hd '(SIN COS LOG EXP ATN ASN ACS SH CH SQR SIGN ABS)) (PROGN (SETQ rr (APPEND rr (LIST (LIST hd (inf2pref (CAR tl)))))) (SETQ tl (CDR tl)))) ((ATOM hd) (SETQ rr (APPEND rr (LIST hd)))) (T (SETQ rr (APPEND rr (LIST (inf2pref hd)))))) (COND ((NULL tl) (RETURN (inf-aux rr NIL NIL)))) (SETQ xx tl) (GO LOOP))) (DEFUN inf-aux (ae operators operands) (inf-iter (CDR ae) operators (CONS (CAR ae) operands))) (DEFUN inf-iter (ae operators operands) (PROG NIL (COND ((AND (NULL ae) (NULL operators)) (RETURN (CAR operands)))) (COND ((AND (NOT (NULL ae)) (OR (NULL operators) (> (weight (CAR ae)) (weight (CAR operators))))) (RETURN (inf-aux (CDR ae) (CONS (CAR ae) operators) operands)))) (RETURN (inf-iter ae (CDR operators) (CONS (LIST (opcode (CAR operators)) (CADR operands) (CAR operands)) (CDDR operands)))))) (DEFUN weight (x) (COND ((EQ x (QUOTE +)) 1) ((EQ x (QUOTE -)) 1) ((EQ x (QUOTE *)) 2) ((EQ x (QUOTE /)) 2) ((EQ x (QUOTE ^)) 3) (T 5))) (defun opcode (op) (COND ((EQ op (QUOTE +)) (QUOTE +)) ((EQ op (QUOTE -)) (QUOTE -)) ((EQ op (QUOTE *)) (QUOTE *)) ((EQ op (QUOTE /)) (QUOTE /)) ((EQ op (QUOTE ^)) (QUOTE ^)) (T (error 'bad_opcode)))) (defun вычисли (выражение) (eval (inf2pref выражение))) ==> вычисли (вычисли '(2 + 15 /(3 + 2))) ==> 5
Объяснение кода листинга программы
Код представляет собой интерпретатор для вычисления выражений в инфиксной записи. Он использует несколько функций для выполнения различных операций:
atomlist
: проверяет, является ли входной элемент списком, и если да, то рекурсивно вызывает себя для каждого элемента списка, пока не достигнет листа. Если встречает атом, возвращает его. Если встречает ноль, возвращаетnil
.inf2pref
: основная функция для вычисления выражения. Она использует цикл для обработки списка от начала до конца. Если встречается оператор, она вызывает функциюinf-aux
для вычисления выражения. Если встречается атом, она добавляет его в результат.inf-aux
: вспомогательная функция для вычисления выражения. Она использует итерацию для обработки списка от начала до конца. Если встречается оператор, она вызывает себя для следующего элемента списка. Если встречается атом, она добавляет его в результат.weight
: функция для определения приоритета оператора. Она проверяет оператор на равенство одному из пяти приоритетных операторов и возвращает соответствующее значение.opcode
: функция для определения кода оператора. Она проверяет оператора на равенство одному из пяти приоритетных операторов и возвращает соответствующий код.eval
: обобщенная функция для вызоваinf2pref
с целью вычисления выражения.вычисли
: основная функция для вызоваeval
с целью вычисления выражения и возврата результата. В приведенном примере кода вызывается функциявычисли
с аргументом'(2 + 15 /(3 + 2))'
. Функцияinf2pref
вызывается рекурсивно для вычисления выражения. В конечном итоге вызывается функцияeval
, которая возвращает результат вычисления, который затем выводится.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д