Skip to content

Instantly share code, notes, and snippets.

@ruandao
Created December 1, 2015 22:32
Show Gist options
  • Select an option

  • Save ruandao/0aec7afbe998e09cee42 to your computer and use it in GitHub Desktop.

Select an option

Save ruandao/0aec7afbe998e09cee42 to your computer and use it in GitHub Desktop.
2.73.b data-directed derivative system
;#lang planet neil/sicp
#lang racket
(require (planet soegaard/sicp:2:1/sicp))
(define wave einstein)
(define (deriv exp var)
(cond ((number? exp) 0)
((variable? exp) (if (same-variable? exp var) 1 0))
(else ((get 'deriv (operator exp)) (operands exp) var))))
(define (operator exp) (car exp))
(define (operands exp) (cdr exp))
;; sum
(define (install-sum-derivative-package)
;; internal procedures
(define (addend operands) (car operands))
(define (augend operands) (cdr operands))
(define (make-sum a b) (list '+ a b))
(define (deriv-sum operands var)
(make-sum (deriv (addend operands) var)
(deriv (augend operands) var)))
;; interface to the rest of the system
(put 'deriv '+ deriv-sum)
'done)
;; product
(define (install-product-derivative-package)
(install-sum-derivative-package)
;; internal procedure
(define (multiplier operands) (car operands))
(define (multiplicand operands) (cdr operands))
(define (make-product a b) (list '* a b))
(define (deriv-product operands var)
(make-sum (make-product (deriv (multiplier operands) var)
(multiplicand operands))
(make-product (multiplier operands)
(deriv (multiplicand operands) var))))
;; interface to the rest of the system
(put 'deriv '* deriv-product)
'done)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment