Функциональное программирование




Массивы. Макросы. Пример программы на лиспе - часть 4


Испoльзуем

(diff0 '(+ x (* 3 x)) 'x) ( + 1 (+ (* 0 x) (* 1 3))) = 4 (diff0 '(- x (* 3 x)) 'x) return (- x (* 3 x)) Why? (diff0 '(* x ( + x 1)) 'x) (+ (* 1 ( x 1))(*(1 0) x))

Вычисляемые выражения не упрощаются,хотя это не трудно сделать.


9.5.1 Модульный подход.

Эта программа неудобна,так как трудно расширять,приходится все группировать в один

cond.Она не является модульной.

Мы получим более удобное решение,если для каждого действия определим свою дифференцирующую функцию и через свойство diff свяжем эту функцию с символом ,обозначающим действие.

Прoстим запись самой дифференцирующей функции:

(defun dif1 (l x) (cond (( atom l) (if (eq l x) 1 0)) ( t (funcall (get (first l) 'diff) (cdr l) x))))

Функции дифференцирования становятся значениями свойства 'diff:

(setf (get '+ 'diff) 'dif+) (setf (get '* 'diff) 'dif*)

Таким образом извлекаем действие из данных. Сами функции записываются:

(defun dif* (l x) (list '+ (list '* (dif1 (first l) x) (second l)) (list '* (dif1 (second l) x) (first l)))) (defun dif+ (l x) (list '+ (dif1 (first l) x) (dif1 (second l) x)))

Благодаря модульности можно дополнить для -

(defun dif- (l x) (list '- (dif1 (first l) x) (dif1 second l) x)))

Таким образом, первоначальное упрaвление вычислительным процессом, связанное со структурой программы, мы преобразовали в динамическое управление основанное на данных.

Можно использовать макросы.
Определим макрос

defdif , c помощью которого определяются дифференцирующие функции для новых действий:

(defmacro defdif (act args body) `(setf (get ',act 'diff) '(lambda,args,body)))

Тогда дифф. функции задаются:

(defdif + (l x) (list '+ (dif1 (first l) x) (dif1 (second l) x))) (defdif * (l x) (list '+ (list '* (dif1 (first l) x) (second l)) (list '* (dif1 (second l) x) (first l)))) (dif1 '(+ x x) 'x) (defdif - (l x) (list '- (dif1 (first l) x) (dif1 (second l) x))) (dif1 '(+ x (* 3 x)) 'x) (dif1 '(- x (* 3 x)) 'x) (dif1 '(* x ( - x 1)) 'x)


9.5.2 Интерфейс программы.

Дополним программу несколькими функциями,обеспечивающими ввод информации:




Содержание  Назад  Вперед