Contents    Page-10    Prev    Next    Page+10    Index   

Instantiating Design Patterns

sublis can be used to instantiate design patterns. For example, we can instantiate a tree-recursive accumulator pattern to make various functions:


(def pattern
  '(defn ?fun [tree]
     (if (cons? tree)
         (?combine (?fun (first tree))
                   (?fun (rest tree)))
         (if (?test tree) ?trueval ?falseval))))

>(sublis '((?fun      nnums  )
           (?combine  +      )
           (?test     number?)
           (?trueval  1      )
           (?falseval 0      ))      pattern)

(defn nnums [tree]
  (if (cons? tree)
      (+ (nnums (first tree))
         (nnums (rest tree)))
      (if (number? tree) 1 0)))

>(nnums '(+ 3 (* i 5)))
2