I struggled a while to understand how to use \prg_whiledo:nT.
I think I figured it out, but it seems to be rather clumsy:


\tlp_new:N \a_tlp
\int_new:N \a_int
\int_zero:N \a_int

\prg_whiledo:nT {
  \tlp_set:Nx \a_tlp {
    \predicate_p:n {
      \int_compare_p:nNn \a_int < 4 &&
      \c_true % some complex tests here
  \exp_after:NN \tlp_if_eq:NNT \a_tlp
  \io_put_term:x{Loop~ \int_use:N \a_int}
  \int_incr:N \a_int


Is this the way how to use it? Or did I miss something?

In xtheorem.sty it is used as:

      \int_compare:nNnT \etex_lastnodetype:D = \c_eleven

And actually, this was the way it expected it to work? But
it doesn't work, does it? I didn't run xtheorem.sty, though.