Макрос на Racket - Lisp
Формулировка задачи:
Доброго времени суток.
Есть следующая функция:
Хочется написать макрос, который будет генерировать список условий:
, где x - элемент списка В какую сторону копать? Спасибо.
(define (deriv exp var)
(cond
((number? exp) (derive-number exp var))
((variable? exp) (deriv-var exp var))
((sum? exp) (deriv-sum exp var))
((sub? exp) (deriv-sub exp var))
((product? exp) (deriv-product exp var))
((div? exp) (deriv-div exp var))
((pow? exp) (deriv-pow exp var))
((sin? exp) (deriv-sin exp var))
((cos? exp) (deriv-cos exp var))
((tan? exp) (deriv-tan exp var))
((log? exp) (deriv-log exp var))
((ln? exp) (deriv-ln exp var))
(else (error "unknown expression type -- DERIV" exp))))((x? exp) (derive-x exp var))
(number, variable...)
Решение задачи: «Макрос на Racket»
textual
Листинг программы
(define (deriv exp var) ((match exp ((? number?) deriv-number) ((? variable?) deriv-var) (else (error "unknown expression type -- DERIV" exp))) exp var))
Объяснение кода листинга программы
В данном коде представлен макрос с именем deriv, который принимает два аргумента: exp и var. Данный макрос вычисляет производную выражения exp по переменной var.
Внутренний блок кода содержит функцию match, которая пытается сопоставить выражение exp с различными шаблонами. Если выражение является числом, то вызывается функция deriv-number. Если выражение является переменной, то вызывается функция deriv-var. Если выражение не соответствует ни одному из этих шаблонов, то вызывается функция error, которая генерирует ошибку с сообщением unknown expression type -- DERIV.
Код не содержит дополнительных комментариев, поэтому это все, что можно сказать о его функциональности.