예제 #1
0
파일: ap.c 프로젝트: urbit/urbit
 u3_noun
 u3qfp_open(u3_noun ter,
            u3_noun fab,
            u3_noun gen)
 {
   return _ap_open_l(ter, fab, gen);
 }
예제 #2
0
파일: ap.c 프로젝트: OCForks/urbit
  /** hack
  **/
    u3_noun
    u3qfp_hack(u3_noun ter,
               u3_noun gen)
    {
      u3_noun p_gen, q_gen;
      u3_noun ret;

      if ( c3y == u3du(u3h(gen)) ) {
        return u3nt(c3y,
                    u3k(u3h(gen)),
                    u3k(u3t(gen)));
      }
      else switch ( u3h(gen) ) {
        case c3__tsgr: u3x_cell(u3t(gen), &p_gen, &q_gen);
        {
          if ( (c3n == u3du(p_gen)) || (u3_nul != u3h(p_gen)) ) {
            return u3nc(c3n, u3k(gen));
          }
          else {
            u3_noun pyr = u3qfp_hack(ter, q_gen);

            if ( c3y == u3h(pyr) ) {
              ret = u3nt(c3y,
                         u3nt(c3__tsgr,
                              u3k(p_gen),
                              u3k(u3h(u3t(pyr)))),
                         u3nt(c3__tsgr,
                              u3k(p_gen),
                              u3k(u3t(u3t(pyr)))));
            }
            else {
              ret = u3nc(c3n,
                         u3nt(c3__tsgr,
                              u3k(p_gen),
                              u3k(u3t(pyr))));
            }
            u3z(pyr);
            return ret;
          }
        }
        case c3__zpcb: u3x_cell(u3t(gen), &p_gen, &q_gen);
        {
          u3_noun pyr = u3qfp_hack(ter, q_gen);

          if ( c3y == u3h(pyr) ) {
            ret = u3nt(c3y,
                       u3nt(c3__zpcb,
                            u3k(p_gen),
                            u3k(u3h(u3t(pyr)))),
                       u3nt(c3__zpcb,
                            u3k(p_gen),
                            u3k(u3t(u3t(pyr)))));
          }
          else {
            ret = u3nc(c3n,
                       u3nt(c3__zpcb,
                            u3k(p_gen),
                            u3k(u3t(pyr))));
          }
          u3z(pyr);
          return ret;
        }
        default: break;
      }

      {
        u3_noun voq = _ap_open_l(ter, gen);

        if ( u3_none == voq ) {
          return u3nc(c3n, u3k(gen));
        }
        else if ( c3y == u3r_sing(voq, gen) ) {
          return u3nc(c3n, voq);
        }
        else {
          ret = u3qfp_hack(ter, voq);

          u3z(voq);
          return ret;
        }
      }
    }