virtual void VisitExpr( const  SymbolicExpr& v) 
  { 
     SymbolicVal in1, fr1;
     bool _hasfrac = hasfrac;
     SymbolicExpr::OpdIterator opds = v.GetOpdIterator();
     for ( ; !opds.ReachEnd(); ++opds) {
        if (operator()(v.Term2Val(*opds), inp, frp)) {
              _hasfrac = true;
                break;  
        }
     }
     if (opds.ReachEnd()) {
        if (inp != 0) *inp = v;
     }
     else {
         if (inp == 0 && frp == 0)
             return;
         SymbolicExpr* inv = (inp == 0)? 0 : v.DistributeExpr(SYMOP_NIL, SymbolicVal());
         SymbolicExpr* frv = (frp == 0)? 0 : v.DistributeExpr(SYMOP_NIL, SymbolicVal());
         SymbolicExpr::OpdIterator opd1 = v.GetOpdIterator();
         for ( ; opd1 != opds ; ++opd1) {
             if (inv != 0)
                 inv->AddOpd(*opd1);
             if (frv != 0)
                 frv->AddOpd(*opd1);
           }
          if (inv != 0)
              inv->ApplyOpd(*inp);
          if (frv != 0)
              frv->ApplyOpd(*frp);
          for (++opd1; !opd1.ReachEnd(); ++opd1) {
             SymbolicVal cur = v.Term2Val(*opd1);
             if (operator()(cur, inp, frp)) {
                if (inv != 0)
                    inv->ApplyOpd(*inp);
                if (frv != 0)
                    frv->ApplyOpd(*frp);
             }
             else {
                if (inv != 0)
                    inv->AddOpd(*opd1);
                if (frv != 0)
                    frv->AddOpd(*opd1);
             }
          }   
          if (inp != 0) 
               *inp = GetExprVal(inv);
          if (frp != 0)
               *frp = GetExprVal(frv);
    }
    hasfrac = _hasfrac;
  }