Note that for the v function you don’t need to use @, but just a simple train 
of 3 verbs (100 > ]) … consider the 100 a constant function returning 100.

   (2&*)^:(10 > ])^:3 ] 1
8
   (2&*)^:(10 > ])^:5 ] 1
16


> On 26 May 2020, at 6:02 pm, Anton Wallgren <[email protected]> wrote:
> 
> Yes, maybe for loop is the way to go. It just seems very un-J :). I did try 
> f^:v^:n earlier, but it didn’t work, it ran f 2*n times. But when I try it 
> now with my simple example,
> 
> (2&*)^:(10&> @ ])^:3 ] 1
> 
> returns 8, and
> 
> (2&*)^:(10&> @ ])^:5 ] 1
> 
> returns 16, as expected. Maybe there is something going on with my “v” in my 
> earlier code.
> 
> Thanks, Anton Wallgren
> On 26 May 2020, 09:11 +0200, Raul Miller <[email protected]>, wrote:
>> ^:_ doesn't impose the max limit on iterations, though...
>> 
>> I think, for something that quirky, I'd just use a for loop. That
>> said, f^:v^:n would work -- I'm just not sure it's optimized
>> adequately.
>> 
>> I hope this helps,
>> 
>> --
>> Raul
>> 
>> On Tue, May 26, 2020 at 2:39 AM 'Rob Hodgkinson' via Programming
>> <[email protected]> wrote:
>>> 
>>> Hi Anton, welcome to J.
>>> 
>>> This is a further parameter to the power operator (^:) described here:
>>> 
>>> https://code.jsoftware.com/wiki/Vocabulary/Loopless 
>>> <https://code.jsoftware.com/wiki/Vocabulary/Loopless> Section “Types of 
>>> Loops” and the row in the table “Apply a verb repeatedly”, “Until a 
>>> condition is met”.
>>> Use Power ([x] u^:v^:_ y)
>>> 
>>> For your example, double while a condition (eg let’s say while the sequence 
>>> is < 100 and stop with the value that breaches that condition …)
>>> 
>>> 2&* ^:(100>])^:_ (1) NB. Sequence here is 1,2,4,8,16,32,64,128
>>> 128
>>> 
>>> 2&* ^:(100>])^:_ (5) NB. Sequence is 5, 10, 20, 40, 80, 160
>>> 160
>>> 
>>> Best, Rob
>>> 
>>>> On 26 May 2020, at 4:09 pm, Anton Wallgren <[email protected]> wrote:
>>>> 
>>>> Hello!
>>>> 
>>>> Fairly recent J enthusiast here. I’m wondering about the idiomatic way to 
>>>> iterate at most n times? I.e. do f^:n y, but with the possibility of an 
>>>> early exit if some condition is met. Is it (u F. ]) y, where u is f but 
>>>> with some Z:’s added? E.g
>>>> 
>>>> f=: 2&*
>>>> MAX=: n
>>>> 
>>>> u=: monad define
>>>> _2 Z: -.*MAX=: MAX - 1
>>>> _2 Z: some other condition
>>>> f y
>>>> )
>>>> 
>>>> But then you need to globally assign and reassign MAX and this doesn’t 
>>>> feel very elegant. Another option of course is to use a for-loop with 
>>>> break.
>>>> 
>>>> Thanks, Anton Wallgren
>>>> ----------------------------------------------------------------------
>>>> For information about J forums see http://www.jsoftware.com/forums.htm
>>> 
>>> ----------------------------------------------------------------------
>>> For information about J forums see http://www.jsoftware.com/forums.htm
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm

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

Reply via email to