code: function if_eval(node) {
      if(node.type === 'ident') {
        return (registry[node.token.data] || getctx(node.token.data) || {}).text
      }
  
      if(node.type === 'literal') {
        return node.token.data === 'true' ? true :
              node.token.data === 'false' ? false :
              node.token.data | 0
      }
  
      if(node.type !== 'binary' && node.type !== 'unary') {
        return node.children.every(if_eval)
      }
  
      var children = node.children || []
        , lhs = children[0]
        , rhs = children[1]
        , _ = if_eval
  
      if(node.type === 'unary') {
        switch(node.token.data) {
          case 'defined': return !!(lhs.token.data in registry)
          case '+': return +_(lhs)
          case '-': return -_(lhs)
          case '~': return ~_(lhs)
          case '!': return !_(lhs)
          case '(': return _(lhs)
        }
      }
  
      switch(node.token.data) {
        case '+':   return _(lhs) + _(rhs)
        case '-':   return _(lhs) - _(rhs)
        case '^':   return _(lhs) ^ _(rhs)
        case '*':   return _(lhs) * _(rhs)
        case '/':   return _(lhs) / _(rhs)
        case '%':   return _(lhs) % _(rhs)
        case '>>':  return _(lhs) >> _(rhs)
        case '<<':  return _(lhs) << _(rhs)
        case '<':   return _(lhs) < _(rhs)
        case '>':   return _(lhs) > _(rhs)
        case '<=':  return _(lhs) <= _(rhs)
        case '>=':  return _(lhs) >= _(rhs)
        case '==':  return _(lhs) === _(rhs)
        case '!=':  return _(lhs) !== _(rhs)
        case '|':   return _(lhs) | _(rhs)
        case '||':  return _(lhs) || _(rhs)
        case '&':   return _(lhs) & _(rhs)
        case '&&':  return _(lhs) && _(rhs)
      }
    }
docs: tiny runtime: