docs: function findNodes (rhs, config) {
    var pt = this
    config = config || {}
    if (config.excludeSubtree)
      return []
    config.nodePredicate = config.nodePredicate || function (config, node) { return node }
    config.makeChildConfig = config.makeChildConfig || function (config, node, nChild) { return config }
    var nodePredicate = config.nodePredicate, makeChildConfig = config.makeChildConfig
    return rhs.reduce (function (result, node) {
      var foundNode = nodePredicate (config, node)
      var childConfig = function (n) { return makeChildConfig (config, node, n) }
      var r = null
      if (typeof(node) === 'object')
        switch (node.type) {
        case 'lookup':
          break
        case 'assign':
          r = pt.findNodes ((node.value || []).concat (node.local || []), childConfig())
          break
        case 'alt':
          r = node.opts.reduce (function (altResults, opt) {
            return altResults.concat (pt.findNodes (opt, childConfig()))
          }, [])
          break
        case 'rep':
          r = pt.findNodes (node.unit, childConfig())
          break
        case 'func':
  	switch (node.funcname) {
  	case 'eval':
  	  r = pt.findNodes (node.args.concat (node.value || []), childConfig())
  	  break
  	case 'link':
  	  r = pt.findNodes ([node.args[0]], childConfig(0))
  	    .concat (pt.findNodes ([node.args[1]], childConfig(1)))
  	  break
  	case 'strictquote':
  	case 'quote':
  	case 'unquote':
          default:
  	  r = pt.findNodes (node.args, childConfig())
            break
  	}
          break
        case 'cond':
          r = pt.findNodes (node.test.concat (node.t, node.f), childConfig())
          break
        case 'root':
        case 'alt_sampled':
          r = pt.findNodes (node.rhs, childConfig())
          break
        case 'rep_sampled':
          r = pt.findNodes (node.reps.reduce (function (all, rep) { return all.concat(rep) }, []), childConfig())
          break
        default:
        case 'sym':
          r = pt.findNodes (node.rhs || node.bind || [], childConfig())
          break
        }
      return result.concat(foundNode ? [foundNode] : []).concat(r || []);
    }, [])
  }