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