예제 #1
0
파일: comb.c 프로젝트: Gunga/urbit
/* functions
*/
  u3_noun
  u3qf_comb(u3_noun mal,
            u3_noun buz)
  {
    if ( (u3_none == mal) || (u3_none == buz) ) {
      return u3_none;
    }
    else {
      u3_noun p_mal, q_mal, p_buz, q_buz, pp_buz, pq_buz;

      if ( (c3y == u3r_p(mal, 0, &p_mal)) && (0 != p_mal) ) {
        if ( (c3y == u3r_p(buz, 0, &p_buz)) && (0 != p_buz) ) {
          return u3nc(0,
                      u3qc_peg(p_mal, p_buz));
        }
        else if ( c3y == u3r_pq(buz, 2, &p_buz, &q_buz) &&
                  c3y == u3r_p(p_buz, 0, &pp_buz) &&
                  c3y == u3r_p(q_buz, 0, &pq_buz) )
        {
          return u3nt(2,
                      u3nc(0,
                           u3qc_peg(p_mal, pp_buz)),
                      u3nc(0,
                           u3qc_peg(p_mal, pq_buz)));
        }
        else return u3nt(7, 
                         u3k(mal),
                         u3k(buz));
      }
#if 1
      else if ( (c3y == u3r_bush(mal, &p_mal, &q_mal)) &&
                (c3y == u3du(p_mal)) &&
                (c3y == u3du(q_mal)) &&
                (0 == u3h(q_mal)) &&
                (1 == u3t(q_mal)) )
      {
        return u3nt(8, 
                    u3k(p_mal),
                    u3k(buz));
      }
#endif
      else if ( (c3y == u3r_p(buz, 0, &p_buz)) &&
                (c3y == u3r_sing(1, p_buz)) )
      {
        return u3k(mal);
      }
      else return u3nt(7, 
                       u3k(mal),
                       u3k(buz));
    }
  }
예제 #2
0
파일: peg.c 프로젝트: aulux/urbit
  u3_noun
  u3wc_peg(
                  u3_noun cor)
  {
    u3_noun a, b;

    if ( (c3n == u3r_mean(cor, u3x_sam_2, &a, u3x_sam_3, &b, 0)) ||
         (c3n == u3ud(a)) ||
         (c3n == u3ud(b)) ||
         (0 == a) ||
         (0 == b) )
    {
      return u3m_bail(c3__exit);
    } else {
      return u3qc_peg(a, b);
    }
  }
예제 #3
0
파일: ut_fish.c 프로젝트: OCForks/urbit
  static u3_noun
  _fish_in(u3_noun van,
           u3_noun sut,
           u3_atom axe,
           u3_noun vit)
  {
    u3_noun p_sut, q_sut;

    if ( c3y == u3ud(sut) ) switch ( sut ) {
      default: return u3m_bail(c3__fail);

      case c3__noun: {
        return u3nc(1, 0);
      }
      case c3__void: {
        return u3nc(1, 1);
      }
    }
    else switch ( u3h(sut) ) {
      default: return u3m_bail(c3__fail);

      case c3__atom: {
        if ( (c3n == u3r_trel(sut, 0, &p_sut, &q_sut)) ) {
          return u3m_bail(c3__fail);
        } else {
          if ( c3n == u3du(q_sut) ) {
            u3_noun ton = u3nt(3, 0, u3k(axe));
            u3_noun pro = u3qf_flip(ton);

            u3z(ton);
            return pro;
          } else {
            return u3nt(5,
                        u3nc(1, u3k(u3t(q_sut))),
                        u3nc(0, u3k(axe)));
          }
        }
      }
      case c3__cell: {
        if ( (c3n == u3r_trel(sut, 0, &p_sut, &q_sut)) ) {
          return u3m_bail(c3__fail);
        } else {
          u3_noun hut = u3nt(3, 0, u3k(axe));
          u3_noun lef = u3qc_peg(axe, 2);
          u3_noun rit = u3qc_peg(axe, 3);
          u3_noun hed = _fish_in(van, p_sut, lef, vit);
          u3_noun tal = _fish_in(van, q_sut, rit, vit);
          u3_noun hob = u3qf_flan(hed, tal);
          u3_noun vug = u3qf_flan(hut, hob);

          u3z(hob);
          u3z(tal);
          u3z(hed);
          u3z(rit);
          u3z(lef);
          u3z(hut);

          return vug;
        }
      }
      case c3__core: {
        return u3nc(0, 0);
      }
      case c3__face: {
        if ( (c3n == u3r_trel(sut, 0, &p_sut, &q_sut)) ) {
          return u3m_bail(c3__fail);
        } else {
          return _fish_in(van, q_sut, axe, vit);
        }
      }
      case c3__fork: p_sut = u3t(sut);
      {
        u3_noun yed = u3qdi_tap(p_sut, u3_nul);
        u3_noun ret = _fish_fork(van, yed, axe, vit);

        u3z(yed);
        return ret;
      }
      case c3__hold: {
        p_sut = u3t(sut);
        {
          if ( (c3y == u3qdi_has(vit, sut)) ) {
            //  u3_noun dun = u3qfu_dunq(van, "type", sut);
            u3_noun niz = u3qfu_shep
              (van, "axis", 'd', u3k(axe));

            //  u3t_push(u3nc(c3__mean, dun));
            u3t_push(u3nc(c3__mean, niz));

            return u3m_error("fish-loop");
          } else {
            u3_noun zoc = u3qdi_put(vit, sut);
            u3_noun fop = u3qfu_repo(van, sut);
            u3_noun pro = _fish_in(van, fop, axe, zoc);

            u3z(fop);
            u3z(zoc);

            return pro;
          }
        }
      }
    }
  }