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