up_get.c (1612B)
1 #include "all.h" 2 3 u3_noun 4 u3qdu_get(u3_noun a, u3_noun k) 5 { 6 if (u3_nul == a) { 7 return u3_nul; 8 } 9 10 u3_atom hoc = u3h(a); 11 12 if (c3n == u3ud(hoc)) { 13 return u3m_bail(c3__exit); 14 } 15 else switch ( hoc) { 16 default: 17 return u3m_bail(c3__exit); 18 19 case c3__tip: { 20 u3_noun ka, pa, va; 21 u3x_trel(u3t(a), &ka, &pa, &va); 22 23 u3_noun vva, tva; 24 u3x_cell(va, &vva, &tva); 25 26 u3_atom mk = u3r_mug(k); 27 u3_atom mka = u3r_mug(ka); 28 29 if (c3n == u3r_sing(mk, mka)) { 30 return u3_nul; 31 } 32 else if (c3y == u3r_sing(k, ka)) { 33 return u3nt(u3_nul, u3k(pa), u3k(vva)); 34 } 35 else { 36 return u3qdu_qor_get(tva, k); 37 } 38 } 39 40 case c3__bin: { 41 u3_noun ka, pa, va, ta; 42 u3_noun vva, tva; 43 u3_noun ma, la, ra; 44 45 u3x_qual(u3t(a), &ka, &pa, &va, &ta); 46 u3x_cell(va, &vva, &tva); 47 u3x_trel(ta, &ma, &la, &ra); 48 49 u3_noun mk = u3r_mug(k); 50 u3_noun mka = u3r_mug(ka); 51 52 if (c3y == u3qdu_feud(ma, k, ka)) { 53 return u3_nul; 54 } 55 else if (c3y == u3r_sing(mk, mka)) { 56 if (c3y == u3r_sing(k, ka)) { 57 return u3nt(u3_nul, u3k(pa), u3k(vva)); 58 } 59 else { 60 return u3qdu_qor_get(tva, k); 61 } 62 } 63 else if (c3y == u3qdu_zero(ma, k)) { 64 return u3qdu_get(la, k); 65 } 66 else { 67 return u3qdu_get(ra, k); 68 } 69 } 70 } 71 } 72 73 u3_noun 74 u3wdu_get(u3_noun cor) 75 { 76 u3_noun a, k; 77 78 if (c3n == u3r_mean(cor, u3x_sam_2, &a, u3x_sam_3, &k, 0)) 79 { 80 return u3m_bail(c3__exit); 81 } else { 82 return u3qdu_get(a, k); 83 } 84 } 85 86