Instantiating Design Patterns
sublis can instantiate design patterns. For example, we can instantiate a tree-recursive accumulator pattern to make various functions:
(setq pattern '(defun ?fun (tree) (if (consp tree) (?combine (?fun (car tree)) (?fun (cdr tree))) (if (?test tree) ?trueval ?falseval)))) >(sublis '((?fun . nnums) (?combine . +) (?test . numberp) (?trueval . 1) (?falseval . 0)) pattern) (DEFUN NNUMS (TREE) (IF (CONSP TREE) (+ (NNUMS (CAR TREE)) (NNUMS (CDR TREE))) (IF (NUMBERP TREE) 1 0))) >(nnums '(+ 3 (* i 5))) 2