Some consider abort to be the most fundamental building block in writing programs. trail and listen abort execution.

~~~:s:shout   (s-) '!!->_ s:prepend '_<-!! s:append s:put nl ; {{   :put-name (a-) fetch d:lookup-xt     dup n:-zero? [ d:name s:put nl ] &drop choose ; ---reveal---   :trail (-0) '1_or_more_0s_left_on_the_stack s:shout     repeat pop put-name again ; }} ~~~

trail adds at least one 0 ( FALSE flag ) on top of stack.

```:t0 trail ; :t1 t0 ; :t2 t1 ; t2 ```

Example of 0; killing a session:

```:t 'before_ s:put 0; 'after s:put nl ; #0 t    (works #1 t    (works reset t (kills_session ```

If this is dangerous, place a guard or a check before 0; .

~~~:d:ego (-s) d:last d:name compile:lit ; immediate :s:prepend;put  s:prepend s:put nl ; :s:trail  (s-0) '(_s:trail_)__  s:prepend;put trail  ; :s:listen (s-)  '(_s:listen_)__ s:prepend;put listen ;   :guard    (q-)  call &trail  -if ; :check    (q-)  call &listen -if ;   :s:guard  (sq-) call &drop &s:trail  choose ; :s:check  (sq-) call &drop &s:listen choose ; ~~~

check is less noisy than trail .

```:t0 (q-) 'Doing... s:put nl   d:ego '_charlie s:append swap s:guard   'Next... s:put nl ; :u0 t0 ; :v0 d:ego '_calling_u0 s:append s:put;nl u0 ; nl nl &TRUE v0 nl &FALSE v0 nl ```

```:t1 (q-) 'Doing... s:put nl   d:ego '_ckpt s:append swap s:check   'Next... s:put nl ; :u1 t1 ; :v1 d:ego '_calling_u1 s:append s:put;nl u1 ; nl nl &TRUE v1 nl &FALSE v1 nl ```