1 /* j/6/fish.c 2 ** 3 */ 4 #include "all.h" 5 6 /* functions 7 */ 8 static u3_noun 9 _fish_in(u3_noun, u3_noun, u3_atom, u3_noun); 10 11 static u3_noun _fish_fork(u3_noun van,u3_noun p_sut,u3_atom axe,u3_noun vit)12 _fish_fork(u3_noun van, 13 u3_noun p_sut, 14 u3_atom axe, 15 u3_noun vit) 16 { 17 if ( u3_nul == p_sut ) { 18 return u3nc(1, 1); 19 } 20 else { 21 u3_noun hed = _fish_in(van, u3h(p_sut), axe, vit); 22 u3_noun tal = _fish_fork(van, u3t(p_sut), axe, vit); 23 u3_noun pro = u3qf_flor(hed, tal); 24 25 u3z(hed); 26 u3z(tal); 27 28 return pro; 29 } 30 } 31 32 static u3_noun _fish_in(u3_noun van,u3_noun sut,u3_atom axe,u3_noun vit)33 _fish_in(u3_noun van, 34 u3_noun sut, 35 u3_atom axe, 36 u3_noun vit) 37 { 38 u3_noun p_sut, q_sut; 39 40 if ( c3y == u3ud(sut) ) switch ( sut ) { 41 default: return u3m_bail(c3__fail); 42 43 case c3__noun: { 44 return u3nc(1, 0); 45 } 46 case c3__void: { 47 return u3nc(1, 1); 48 } 49 } 50 else switch ( u3h(sut) ) { 51 default: return u3m_bail(c3__fail); 52 53 case c3__atom: { 54 if ( (c3n == u3r_trel(sut, 0, &p_sut, &q_sut)) ) { 55 return u3m_bail(c3__fail); 56 } else { 57 if ( c3n == u3du(q_sut) ) { 58 u3_noun ton = u3nt(3, 0, u3k(axe)); 59 u3_noun pro = u3qf_flip(ton); 60 61 u3z(ton); 62 return pro; 63 } else { 64 return u3nt(5, 65 u3nc(1, u3k(u3t(q_sut))), 66 u3nc(0, u3k(axe))); 67 } 68 } 69 } 70 case c3__cell: { 71 if ( (c3n == u3r_trel(sut, 0, &p_sut, &q_sut)) ) { 72 return u3m_bail(c3__fail); 73 } else { 74 u3_noun hut = u3nt(3, 0, u3k(axe)); 75 u3_noun lef = u3qc_peg(axe, 2); 76 u3_noun rit = u3qc_peg(axe, 3); 77 u3_noun hed = _fish_in(van, p_sut, lef, vit); 78 u3_noun tal = _fish_in(van, q_sut, rit, vit); 79 u3_noun hob = u3qf_flan(hed, tal); 80 u3_noun vug = u3qf_flan(hut, hob); 81 82 u3z(hob); 83 u3z(tal); 84 u3z(hed); 85 u3z(rit); 86 u3z(lef); 87 u3z(hut); 88 89 return vug; 90 } 91 } 92 case c3__core: { 93 return u3nc(0, 0); 94 } 95 case c3__help: 96 case c3__face: { 97 if ( (c3n == u3r_trel(sut, 0, &p_sut, &q_sut)) ) { 98 return u3m_bail(c3__fail); 99 } else { 100 return _fish_in(van, q_sut, axe, vit); 101 } 102 } 103 case c3__fork: p_sut = u3t(sut); 104 { 105 u3_noun yed = u3qdi_tap(p_sut); 106 u3_noun ret = _fish_fork(van, yed, axe, vit); 107 108 u3z(yed); 109 return ret; 110 } 111 case c3__hold: { 112 p_sut = u3t(sut); 113 { 114 if ( (c3y == u3qdi_has(vit, sut)) ) { 115 // u3_noun dun = u3qfu_dunq(van, "type", sut); 116 u3_noun niz = u3qfu_shep 117 (van, "axis", 'd', u3k(axe)); 118 119 // u3t_push(u3nc(c3__mean, dun)); 120 u3t_push(u3nc(c3__mean, niz)); 121 122 return u3m_error("fish-loop"); 123 } else { 124 u3_noun zoc = u3qdi_put(vit, sut); 125 u3_noun fop = u3qfu_repo(van, sut); 126 u3_noun pro = _fish_in(van, fop, axe, zoc); 127 128 u3z(fop); 129 u3z(zoc); 130 131 return pro; 132 } 133 } 134 } 135 } 136 } 137 138 static u3_noun _cqfu_fish(u3_noun van,u3_noun sut,u3_atom axe)139 _cqfu_fish(u3_noun van, 140 u3_noun sut, 141 u3_atom axe) 142 { 143 return _fish_in(van, sut, axe, u3_nul); 144 } 145 146 147 /* boilerplate 148 */ 149 u3_noun u3wfu_fish(u3_noun cor)150 u3wfu_fish(u3_noun cor) 151 { 152 u3_noun sut, axe, van; 153 154 if ( (c3n == u3r_mean(cor, u3x_sam, &axe, u3x_con, &van, 0)) || 155 (c3n == u3ud(axe)) || 156 (u3_none == (sut = u3r_at(u3x_sam, van))) ) 157 { 158 return u3m_bail(c3__fail); 159 } else { 160 return _cqfu_fish(van, sut, axe); 161 } 162 } 163 164 u3_noun u3qfu_fish(u3_noun van,u3_noun sut,u3_noun axe)165 u3qfu_fish(u3_noun van, 166 u3_noun sut, 167 u3_noun axe) 168 { 169 c3_m fun_m = 144 + c3__fish + ((!!u3r_at(u3qfu_van_vet, van)) << 8); 170 u3_noun pro = u3z_find_2(fun_m, sut, axe); 171 172 if ( u3_none != pro ) { 173 return pro; 174 } 175 else { 176 pro = _cqfu_fish(van, sut, axe); 177 178 return u3z_save_2(fun_m, sut, axe, pro); 179 } 180 } 181