1 /* j/6/play.c
2 **
3 */
4 #include "all.h"
5 
6 /* logic
7 */
8 # define _play_used()
9 
10   static u3_noun
11   _play_in(u3_noun, u3_noun, u3_noun);
12 
13   static u3_noun
_play_bean()14   _play_bean()
15   {
16     return u3kf_fork(u3nt(u3nq(c3__atom, 'f', u3_nul, 0),
17                           u3nq(c3__atom, 'f', u3_nul, 1),
18                           u3_nul));
19   }
20 
21   static u3_noun
_play_rock(u3_noun odo,u3_noun bob)22   _play_rock(u3_noun odo, u3_noun bob)
23   {
24     if ( c3y == u3ud(bob) ) {
25       return u3nq(c3__atom, u3k(odo), u3_nul, u3k(bob));
26     }
27     else return u3nt(c3__cell, _play_rock(odo, u3h(bob)),
28                                _play_rock(odo, u3t(bob)));
29   }
30 
31   static u3_noun
_play_sand(u3_noun odo,u3_noun bob)32   _play_sand(u3_noun odo, u3_noun bob)
33   {
34     if ( c3y == u3ud(bob) ) {
35       if ( 'n' == odo ) {
36         if ( (bob != 0) ) {
37           return u3m_bail(c3__exit);
38         } else {
39           return u3nq(c3__atom, odo, u3_nul, bob);
40         }
41       }
42       if ( 'f' == odo ) {
43         if ( (bob > 1) ) {
44           return u3m_bail(c3__exit);
45         } else {
46           return _play_bean();
47         }
48       }
49       return u3nt(c3__atom, u3k(odo), u3_nul);
50     }
51     else return u3nt(c3__cell, _play_rock(odo, u3h(bob)),
52                                _play_rock(odo, u3t(bob)));
53   }
54 
55   static u3_noun
_play_core(u3_noun pac,u3_noun con)56   _play_core(u3_noun pac,
57              u3_noun con)
58   {
59     if ( (c3__void == pac) ) {
60       u3z(con);
61 
62       return c3__void;
63     } else {
64       return u3nt(c3__core, pac, con);
65     }
66   }
67 
68   static u3_noun
_play_loc(u3_noun van,u3_noun loc)69   _play_loc(u3_noun van,
70             u3_noun loc)
71   {
72     u3_noun mol = u3nc('o', u3k(loc));
73     u3_noun sho = u3j_hook(u3k(van), "show");
74     u3_noun ret = u3i_molt(u3k(sho), u3x_sam, u3k(mol), 0);
75 
76     u3z(mol);
77     u3z(sho);
78 
79     return ret;
80   }
81 
82 #if 0
83   static u3_noun
84   _play_loc_term(u3_noun van,
85                  u3_noun loc)
86   {
87     u3_noun fop = u3kb_flop(u3k(u3h(loc)));
88     u3_noun nam = ((0 == fop) ? c3__none : u3k(u3h(fop)));
89     u3_noun lys = u3nt(u3k(u3h(u3t(loc))), u3k(u3t(u3t(loc))), u3_nul);
90     u3_noun rup = u3nc(nam, lys);
91     c3_c*   pre_c = u3m_pretty(rup);
92     u3_noun pro   = u3i_string(pre_c);
93 
94     u3z(fop);
95     u3z(rup);
96     free(pre_c);
97 
98     return pro;
99   }
100 #endif
101 
102 #if 1
103   static u3_noun
_play_cnts(u3_noun van,u3_noun sut,u3_noun hyp,u3_noun rig)104   _play_cnts(u3_noun van,
105              u3_noun sut,
106              u3_noun hyp,
107              u3_noun rig)
108   {
109     u3_noun von = u3i_molt(u3k(van), u3x_sam, u3k(sut), 0);
110     u3_noun gat = u3j_hook(von, "epla");
111 
112     return u3n_kick_on(u3i_molt(gat,
113                                 u3x_sam_2,
114                                 u3k(hyp),
115                                 u3x_sam_3,
116                                 u3k(rig),
117                                 0));
118   }
119 #else
120   static u3_noun
_play_edit(u3_noun van,u3_noun sut,u3_noun mew,u3_noun rag)121   _play_edit(u3_noun van,
122              u3_noun sut,
123              u3_noun mew,
124              u3_noun rag)
125   {
126     while ( 1 ) {
127       if ( c3n == u3du(mew) ) {
128         return rag;
129       } else {
130         u3_noun i_mew = u3h(mew);
131         u3_noun t_mew = u3t(mew);
132         u3_noun pi_mew = u3h(i_mew);
133         u3_noun qi_mew = u3t(i_mew);
134         u3_noun laf = _play_in(van, sut, qi_mew);
135         u3_noun ruz = u3qfu_toss(van, sut, pi_mew, laf, rag);
136 
137         u3z(laf);
138         u3z(rag);
139         rag = u3k(u3t(ruz));
140         u3z(ruz);
141 
142         mew = t_mew;
143       }
144     }
145   }
146   static u3_noun
_play_cnts_old(u3_noun van,u3_noun sut,u3_noun hyp,u3_noun rig)147   _play_cnts_old(u3_noun van,
148                  u3_noun sut,
149                  u3_noun hyp,
150                  u3_noun rig)
151   {
152     u3_noun lar = u3qfu_seek(van, sut, c3__read, hyp);
153     u3_noun q_lar = u3t(lar);
154     u3_noun qq_lar = u3t(q_lar);
155     u3_noun mew = rig;
156     u3_noun rag = _play_edit(van, sut, mew, u3k(qq_lar));
157     u3_noun ret = u3qfu_fire(van, sut, rag);
158 
159     u3z(rag);
160     u3z(lar);
161 
162     return ret;
163   }
164 #endif
165 
166   static u3_noun
_play_grow(u3_noun van,u3_noun sut,u3_atom mel,u3_noun ruf,u3_noun wan,u3_noun dom)167   _play_grow(u3_noun van,
168              u3_noun sut,
169              u3_atom mel,
170              u3_noun ruf,
171              u3_noun wan,
172              u3_noun dom)
173   {
174     u3_noun dan = _play_in(van, sut, ruf);
175 
176     return _play_core(dan,
177                       u3nq(u3k(mel),
178                            u3k(dan),
179                            u3k(wan),
180                            u3nc(u3nc(u3_nul, u3_nul),
181                                 u3k(dom))));
182   }
183 
184   static u3_noun
185   _play_in(u3_noun van,
186            u3_noun sut,
187            u3_noun gen);
188 
189   static u3_noun
_play_x(u3_noun van,u3_noun sut,u3_noun gen)190   _play_x(u3_noun van,
191           u3_noun sut,
192           u3_noun gen)
193   {
194 #if 1
195     return _play_in(van, sut, gen);
196 #else
197     u3_noun zix = u3qfu_shep
198           (van, "gene", 'q', u3k(gen));
199     u3_noun ret;
200 
201     u3t_push(u3nc(c3__mean, zix));
202 
203     ret = _play_in(van, sut, gen);
204 
205     u3t_drop();
206     return ret;
207 #endif
208   }
209 
210   static u3_noun
_play_in(u3_noun van,u3_noun sut,u3_noun gen)211   _play_in(u3_noun van,
212            u3_noun sut,
213            u3_noun gen)
214   {
215     u3_noun p_gen, q_gen, r_gen;
216 
217     if ( c3n == u3du(gen) ) {
218       open: {
219         u3_noun fab = u3r_at(u3qfu_van_fab, van);
220         u3_noun ter = u3r_at(u3x_con_3, van);
221         u3_noun rex = (c3n == fab) ? u3qfp_nepo(ter, gen)
222                                    : u3qfp_open(ter, gen);
223         u3_noun ret;
224 
225         if ( c3y == u3r_sing(rex, gen) ) {
226           u3_noun zix = u3qfu_shep(van, "gene", 'q', u3k(gen));
227 
228           u3t_push(u3nc(c3__mean, zix));
229           return u3m_error("play-open-z");
230         }
231         ret = _play_x(van, sut, rex);
232         u3z(rex);
233 
234         return ret;
235       }
236     }
237     else if ( c3y == u3du(u3h(gen)) ) {
238       _play_used();
239       {
240         u3_noun dis = _play_x(van, sut, u3h(gen));
241         u3_noun dat = _play_x(van, sut, u3t(gen));
242         u3_noun ret = u3qf_cell(dis, dat);
243 
244         u3z(dis);
245         u3z(dat);
246         return ret;
247       }
248     }
249     else switch ( u3h(gen) ) {
250       default: goto open;
251 
252       case c3__fits: u3x_cell(u3t(gen), &p_gen, &q_gen);
253       _play_used();
254       {
255         return _play_bean();
256       }
257 
258       case c3__wtcl: u3x_trel(u3t(gen), &p_gen, &q_gen, &r_gen);
259       _play_used();
260       {
261         u3_noun fex = u3qfu_gain(van, sut, p_gen);
262         u3_noun wux = u3qfu_lose(van, sut, p_gen);
263         u3_noun dez = (fex == c3__void) ? c3__void
264                                         : _play_x(van, fex, q_gen);
265         u3_noun doz = (wux == c3__void) ? c3__void
266                                         : _play_x(van, wux, r_gen);
267         u3_noun ret = u3qf_forq(dez, doz);
268 
269         u3z(dez); u3z(doz);
270         u3z(fex); u3z(wux);
271         return ret;
272       }
273 
274       case c3__clhp: u3x_cell(u3t(gen), &p_gen, &q_gen);
275       _play_used();
276       {
277         u3_noun dis = _play_x(van, sut, p_gen);
278         u3_noun dat = _play_x(van, sut, q_gen);
279         u3_noun ret = u3qf_cell(dis, dat);
280 
281         u3z(dis);
282         u3z(dat);
283         return ret;
284       }
285 
286       case c3__dtkt: u3x_cell(u3t(gen), &p_gen, &q_gen);
287       _play_used();
288       {
289         u3_noun nog = u3nc(c3__bunt, u3k(p_gen));
290         u3_noun ret = _play_x(van, sut, nog);
291 
292         u3z(nog);
293         return ret;
294       }
295 
296       case c3__dtwt: p_gen = u3t(gen);
297       _play_used();
298       {
299         return _play_bean();
300       }
301 
302       case c3__dtts: u3x_cell(u3t(gen), &p_gen, &q_gen);
303       _play_used();
304       {
305         return _play_bean();
306       }
307 
308       case c3__dtls: p_gen = u3t(gen);
309       _play_used();
310       {
311         return u3nt(c3__atom, u3_blip, u3_nul);
312       }
313 
314       case c3__rock: u3x_cell(u3t(gen), &p_gen, &q_gen);
315       _play_used();
316       {
317         return _play_rock(p_gen, q_gen);
318       }
319 
320       case c3__dttr: u3x_cell(u3t(gen), &p_gen, &q_gen);
321       _play_used();
322       {
323         return c3__noun;
324       }
325 
326       case c3__sand: u3x_cell(u3t(gen), &p_gen, &q_gen);
327       _play_used();
328       {
329         return _play_sand(p_gen, q_gen);
330       }
331 
332       case c3__hand: u3x_cell(u3t(gen), &p_gen, &q_gen);
333       _play_used();
334       {
335         return u3k(p_gen);
336       }
337 
338       case c3__ktbr: p_gen = u3t(gen);
339       _play_used();
340       {
341         u3_noun boc = _play_x(van, sut, p_gen);
342         u3_noun pro = u3qfu_wrap(van, boc, c3__iron);
343 
344         u3z(boc);
345         return pro;
346       }
347 
348       case c3__ktpm: p_gen = u3t(gen);
349       _play_used();
350       {
351         u3_noun boc = _play_x(van, sut, p_gen);
352         u3_noun pro = u3qfu_wrap(van, boc, c3__zinc);
353 
354         u3z(boc);
355         return pro;
356       }
357 
358       case c3__ktwt: p_gen = u3t(gen);
359       _play_used();
360       {
361         u3_noun boc = _play_x(van, sut, p_gen);
362         u3_noun pro = u3qfu_wrap(van, boc, c3__lead);
363 
364         u3z(boc);
365         return pro;
366       }
367 
368       case c3__help: u3x_cell(u3t(gen), &p_gen, &q_gen);
369       _play_used();
370       {
371         u3_noun boc = _play_x(van, sut, q_gen);
372         u3_noun ret = u3qf_help(p_gen, boc);
373 
374         u3z(boc);
375         return ret;
376       }
377 
378       case c3__docs: u3x_cell(u3t(gen), &p_gen, &q_gen);
379       _play_used();
380       {
381         u3_noun boc = _play_x(van, sut, q_gen);
382         u3_noun hep = u3nc(c3__docs, u3k(p_gen));
383         u3_noun ret = u3qf_help(hep, boc);
384 
385         u3z(hep);
386         u3z(boc);
387         return ret;
388       }
389 
390       case c3__ktts: u3x_cell(u3t(gen), &p_gen, &q_gen);
391       _play_used();
392       {
393         u3_noun boc = _play_x(van, sut, q_gen);
394         u3_noun ret = u3qfu_conk(van, boc, p_gen);
395 
396         u3z(boc);
397         return ret;
398       }
399 
400       case c3__tune: p_gen = u3t(gen);
401       _play_used();
402       {
403         return u3qf_face(p_gen, sut);
404       }
405 
406       case c3__ktsg: p_gen = u3t(gen);
407       _play_used();
408       {
409         return _play_x(van, sut, p_gen);
410       }
411 
412       case c3__ktls: u3x_cell(u3t(gen), &p_gen, &q_gen);
413       _play_used();
414       {
415         return _play_x(van, sut, p_gen);
416       }
417 
418       case c3__tsgr: u3x_cell(u3t(gen), &p_gen, &q_gen);
419       _play_used();
420       {
421         u3_noun boc = _play_x(van, sut, p_gen);
422         u3_noun ret = _play_x(van, boc, q_gen);
423 
424         u3z(boc);
425         return ret;
426       }
427 
428       case c3__tstr: u3x_trel(u3t(gen), &p_gen, &q_gen, &r_gen);
429       _play_used();
430       {
431         u3_noun boc = u3qfu_buss(van, sut, p_gen, q_gen);
432         u3_noun ret = _play_x(van, boc, r_gen);
433 
434         u3z(boc);
435         return ret;
436       }
437 
438       case c3__tscm: u3x_cell(u3t(gen), &p_gen, &q_gen);
439       _play_used();
440       {
441         u3_noun boc = u3qfu_busk(van, sut, p_gen);
442         u3_noun ret = _play_x(van, boc, q_gen);
443 
444         u3z(boc);
445         return ret;
446       }
447 
448       case c3__cnts: u3x_cell(u3t(gen), &p_gen, &q_gen);
449       _play_used();
450       {
451         return _play_cnts(van, sut, p_gen, q_gen);
452       }
453 
454       case c3__brcn: u3x_cell(u3t(gen), &p_gen, &q_gen);
455       _play_used();
456       {
457         u3_noun ruf = u3nc(u3_nul, 1);
458         u3_noun ret = _play_grow(van, sut, c3__gold, ruf, p_gen, q_gen);
459 
460         u3z(ruf);
461         return ret;
462       }
463 
464       case c3__sgzp: u3x_cell(u3t(gen), &p_gen, &q_gen);
465       _play_used();
466       {
467         u3_noun typ = u3qfu_play(van, sut, p_gen);
468         u3_noun dug = u3qfu_duck(van, typ);
469         u3_noun ret;
470 
471         u3t_push(u3nc(c3__mean, dug));
472         {
473           ret = _play_x(van, sut, q_gen);
474         }
475         u3t_drop();
476 
477         u3z(typ);
478         return ret;
479       }
480 
481       case c3__sggr: u3x_cell(u3t(gen), &p_gen, &q_gen);
482       _play_used();
483       {
484         return _play_x(van, sut, q_gen);
485       }
486 
487       case c3__zpts: p_gen = u3t(gen);
488       _play_used();
489       {
490         return c3__noun;
491       }
492 
493       case c3__ktcn: p_gen = u3t(gen);
494       {
495         u3_noun von = u3i_molt(u3k(van), u3qfu_van_fab, c3n, 0);
496         u3_noun ret = _play_x(von, sut, p_gen);
497 
498         u3z(von);
499         return ret;
500       }
501 
502       case c3__zpcm: u3x_cell(u3t(gen), &p_gen, &q_gen);
503       _play_used();
504       {
505         return _play_x(van, sut, p_gen);
506       }
507 
508       case c3__dbug: u3x_cell(u3t(gen), &p_gen, &q_gen);
509       {
510         u3_noun ret;
511 
512 #if 0
513         {
514           u3_noun cog = _play_loc_term(van, p_gen);
515 
516           u3t_heck(cog);
517           u3z(cog);
518         }
519 #endif
520         u3t_push(u3nc(c3__mean, _play_loc(van, p_gen)));
521         {
522           ret = _play_x(van, sut, q_gen);
523         }
524         u3t_drop();
525         return ret;
526       }
527 
528       case c3__zpmc:
529       case c3__zpsm: u3x_cell(u3t(gen), &p_gen, &q_gen);
530       _play_used();
531       {
532         u3_noun zur = _play_x(van, sut, p_gen);
533         u3_noun vos = _play_x(van, sut, q_gen);
534         u3_noun ret = u3qf_cell(zur, vos);
535 
536         u3z(zur);
537         u3z(vos);
538 
539         return ret;
540       }
541 
542       case c3__lost:
543       case c3__fail:
544       case c3__zpzp:
545       _play_used();
546       {
547         return c3__void;
548       }
549     }
550   }
551 
552   static u3_noun
_cqfu_play(u3_noun van,u3_noun sut,u3_noun gen)553   _cqfu_play(u3_noun van,
554              u3_noun sut,
555              u3_noun gen)
556   {
557     u3_noun von = u3i_molt(u3k(van), u3qfu_van_vet, c3n, 0);
558     u3_noun ret = _play_x(von, sut, gen);
559 
560     u3z(von);
561     return ret;
562   }
563 
564 /* boilerplate
565 */
566   u3_noun
u3wfu_play(u3_noun cor)567   u3wfu_play(u3_noun cor)
568   {
569     u3_noun sut, gen, van;
570 
571     if ( (c3n == u3r_mean(cor, u3x_sam, &gen, u3x_con, &van, 0)) ||
572          (u3_none == (sut = u3r_at(u3x_sam, van))) )
573     {
574       return u3m_bail(c3__fail);
575     } else {
576       return _cqfu_play(van, sut, gen);
577     }
578   }
579 
580   u3_noun
u3qfu_play(u3_noun van,u3_noun sut,u3_noun gen)581   u3qfu_play(u3_noun van,
582              u3_noun sut,
583              u3_noun gen)
584   {
585 #if 1
586     c3_m    fun_m = 144 + c3__play;
587     u3_noun vrf   = u3r_at(u3qfu_van_vrf, van);
588     u3_noun pro   = u3z_find_3(fun_m, vrf, sut, gen);
589 
590     if ( u3_none != pro ) {
591       return pro;
592     }
593     else {
594       pro = _cqfu_play(van, sut, gen);
595 
596       return u3z_save_3(fun_m, vrf, sut, gen, pro);
597     }
598 #else
599     return _cqfu_play(van, sut, gen);
600 #endif
601   }
602