I was asked to explain a statement I had made earlier:

On Sat, Oct 8, 2011 at 8:04 AM, Raul Miller <rauldmil...@gmail.com> wrote:
> Depending on what specifically you are trying to do, ^: may or may not
> be the right thing to use.
>
> The issue is that ^: assumes that it is dealing with a mathematical
> function.  If its function gives the same result twice in a row, it
> will stop right there.
>
> This is how ^:(test)^:_ works something like a while loop -- when
> (test) returns false, the inner ^: becomes an identity function and
> the outer ^: knows that it's time to stop.

This is probably easiest to clarify using examples.

   <.@-:^:_]20
0

If I repeatedly divide a number in half and find the next lower
integer, I get 0.  I can see the intermediate results if I replace ^:_
with ^:a:

   <.@-:^:a:]20
20 10 5 2 1 0

This works because ^: stops when it sees the same value twice in a row.

Now, for contrast, let's consider:

   ? bind 3^:a:]0
0 1 2 0 1 0 1 0
   ? bind 3^:a:]0
0 1 2 1
   ? bind 3^:a:]0
0
   ? bind 3^:a:]0
0 2 0 2 0 2 1

Here, ? bind 3 is not a function.  It arbitrarily picks a result which
will be 0, 1 or 2.  So this mechanism stops, arbitrarily, when ? has
given us the same value twice in a row.

Or, here's a different example:

   require'misc'
      prompt bind 'type something: '^:a: ''
type something: this is something
type something: so is this
type something: and this
type something: and this

this is something
so is this
and this

Here, when I entered the same thing twice in a row, J decided that the
"function" I was using was done -- after all, it gave the same result
twice in a row.

So, anyways, this means that the mechanism
   F ^:test^:_
will terminate prematurely if F is not a function and it produces the
same result twice in a row, even when the result of test was a true
value.

If F was a function and it produced the same result twice in a row,
this would not matter:  If F was a function and it produced the same
result twice in a row, it would produce the same result an infinite
number of times in a row.  So either the result is correct or the
result is irrelevant.  But if you are looking for F to do
"non-functional things" you might be upset if your loop terminated
prematurely (and the simple workaround is to use some other mechanism
to implement your "while" loop -- but you can also arrange so that F
never produces the same result twice in a row).

I hope this makes sense.

-- 
Raul
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to