diff --git a/noun/nock.c b/noun/nock.c index 53db6deaa9..27db114a95 100644 --- a/noun/nock.c +++ b/noun/nock.c @@ -892,6 +892,7 @@ _n_burn(c3_y* pog) &&do_nock, &&do_noct, &&do_deep, &&do_peep, &&do_bump, &&do_same, + &&do_kick, &&do_tick, }; #define BURN() goto *lab[pog[ip_s++]] @@ -985,7 +986,7 @@ _n_burn(c3_y* pog) do_quot: _n_toss(); do_quip: - _n_push(_n_rean(pog, &ip_s)); + _n_push(u3k(_n_rean(pog, &ip_s))); BURN(); do_nock: @@ -1025,5 +1026,41 @@ _n_burn(c3_y* pog) u3z(x); u3z(o); BURN(); + + do_kick: + x = _n_rean(pog, &ip_s); + top = _n_peek(); + o = *top; + u3t_off(noc_o); + *top = u3j_kick(o, x); + u3t_on(noc_o); + if ( u3_none == *top ) { + u3_noun fol = u3r_at(x, o); + if ( u3_none == fol ) { + return u3m_bail(c3__exit); + } + gop = _n_find(fol); + _n_push(o); + *top = _n_burn(gop); + } + BURN(); + + do_tick: + x = _n_rean(pog, &ip_s); + top = _n_peek(); + o = *top; + u3t_off(noc_o); + *top = u3j_kick(o, x); + u3t_on(noc_o); + if ( u3_none == *top ) { + u3_noun fol = u3r_at(x, o); + if ( u3_none == fol ) { + return u3m_bail(c3__exit); + } + *top = o; + pog = _n_find(fol); + ip_s = 0; + } + BURN(); } }