more specifically its adverb returning adverb, but as conjunction: break =: 2 : 'u`(lr@] 13!:8 1:)@.v'
+: break(0 = ])("0) 2 3 0 1 the case for original version is that the first adverb returns a new tacit adverb after only needing to see v. ----- Original Message ----- From: Henry Rich <henryhr...@gmail.com> To: sou...@jsoftware.com Sent: Wednesday, August 3, 2016 8:20 PM Subject: Re: [Jsource] F. WAS: Proposal for new looping primitive x N. Sorry, I don't do double adverbs. Henry Rich On 8/3/2016 8:00 PM, 'Pascal Jasmin' via Source wrote: > as double adverb, > > lr =: 3 : '5!:5 < ''y''' > break =: 1 : '(`(lr@] 13!:8 1:))(@.u)' > > +: (0 = ]) break("0) 2 3 0 1 > |0 > | +:(0=])break("0)2 3 0 1 > > > +:(0 e.])break 2 3 0 1 > |2 3 0 1 > | +:(0 e.])break 2 3 0 1 > > no error, > > > > +:(0=])break("0)2 3 10 1 > 4 6 20 2 > > But the missing feature is I think is tacit return. I understand there is > already a lot of special code, but as a problem example > > find the largest cummulative sum +/\ under 1e6. What if your list has a > billion items? > > syntax would be something like: Returnif is conjunction. > > > +Returnif (1e6 < ])/\ > > > The internals would be that the argument to other adverb (/ in this case) > would be a special gerund of u ar (,<) 'R.' , v ar . And it is up to each > adverb to implement how it handles R. > > But a more general solution would be a 13!: code similar to 13!:8 but does > not halt. Consider: > > > 1!:2&2@:+: (0 = ]) break("0) 2 3 0 1 > 4 > 6 > |0 > | 1!:2&2@:+:(0=])break("0)2 3 0 1 > > if returnif was defined similar to break but used the codes below: > > +:(1=])return("0)2 3 1 11 > > the 13!:81 code would return 4 6 normally, (does not execute last call before > return) > > x 13!:82 would return 4 6 2 . double of 1 included in list. > > 13!:83 would return (0$0.5) ,&< resultsofar (4 6) > > x 13!:84 would return (0$0.5) ,&< resultplus1more(x) (4 6 2) > > > the 0$0.5 code is optional, but basically allows functional error handling, > where you don't want any halting but you can guard results from further > processing. Codes similar to C and socket library also work so 0 ,&< y for > no error. And some number designated as early return (I recommend positive > numbers for "halting" errors, and negative numbers for contextual info about > result. reserving _1 for early return would seem fine) > > > The 13!:8x codes can be simplified from 4 to 2. the y argument to them is > the return value (can be any type), and null ('') signals to return nothing. > It would be up to the user if they want to do 1 more execution to return > extra result or not. J is pretty good at assembling nulls with other data. > > > Here is something weird I noticed btw, > > 1!:2&2@:+/ i.5 > 7 > 9 > 10 > 10 > 10 > > Id expect to see the same numbers as > > +/\ i.5 > 0 1 3 6 10 > > > ----- Original Message ----- > From: Henry Rich <henryhr...@gmail.com> > To: sou...@jsoftware.com > Sent: Wednesday, August 3, 2016 6:29 PM > Subject: Re: [Jsource] F. WAS: Proposal for new looping primitive x N. > > This is a very good idea. Perhaps gerund v could be (selection > function)`(termination function) > > or > > perhaps we could define a 'termination' error code that would be > signaled with 13!:8 > > or maybe someone has a better way. > > Henry Rich > > > On 8/3/2016 3:42 PM, Joe Bogner wrote: >> I like the sound of it. Really happy to hear about a new language feature. >> >> Just a thought - is there any reason to have a way to specify an >> early-termination condition, so the entire set of data doesn't need to be >> evaluated? I don't have a specific use case in mind, so it's not worth it >> if others don't either >> >> >> >> On Wed, Aug 3, 2016 at 9:11 AM, Henry Rich <henryhr...@gmail.com> wrote: >> >>> Thanks for the ideas, guys. New proposal below. >>> >>> Let's keep the definition in explicit form, so that we can have more >>> readers involved. >>> >>> u/\ has no place here: it requires u to be associative. >>> >>> Definition: >>> >>> [x] u F. v y >>> >>> where >>> >>> u is a verb to be applied repeatedly >>> v is a verb to apply to the result of each execution of u, to >>> produce the part saved in the final result, or [: to get the full result >>> of only the final execution of u >>> x is the (optional) initial value (if omitted, u is applied first >>> between the last 2 items of y) >>> y is the argument array >>> F. applies between items of y starting at the end, F: starts at the >>> front. In either case the x argument to u is the next item of y, and the y >>> argument to u is the initial value/state from previous execution. >>> >>> Formal definition: >>> Fdot =: 2 : 0 >>> cap =. [: >>> if. 'v' -:&(5!:1)&< 'cap' do. >>> u&:>/ (<"_1 y) >>> else. >>> v@> u&.>/\. (<"_1 y) >>> end. >>> : >>> cap =. [: >>> if. 'v' -:&(5!:1)&< 'cap' do. >>> u&:>/ (<"_1 y) , <x >>> else. >>> v@> u&.>/\. (<"_1 y) , <x >>> end. >>> ) >>> >>> Fcolon =: 2 : 0 >>> cap =. [: >>> if. 'v' -:&(5!:1)&< 'cap' do. >>> u&:>/@|. (<"_1 y) >>> else. >>> v@> u&.>/\.&.|. (<"_1 y) >>> end. >>> : >>> cap =. [: >>> if. 'v' -:&(5!:1)&< 'cap' do. >>> u&:>/ (|. <"_1 y) , <x >>> else. >>> v@> u&.>/\.&.|. (<"_1 y) ,~ <x >>> end. >>> ) >>> >>> >>> >>> Example: >>> >>> f =. ((i. , ]) >./)@:(({:@])`({.@])`[}) >>> >>> this takes x=list and y=index,value. It stores value into x at location >>> index, and returns the index and value of the largest atom in the resulting >>> list. (Yeah, it's a punk function.) >>> >>> 0 0 f Fdot (1&{) a =: 20 20 ?@$ 10099 99 99 99 99 99 99 99 99 99 99 99 >>> 99 99 99 99 99 99 99 96 0 >>> >>> >>> The result is the list of the indexes that were encountered. >>> >>> 0 0 f Fdot [: a =: 20 20 ?@$ 100 >>> >>> 2 99 >>> >>> >>> The result is the result of the last execution only. >>> >>> >>> Henry Rich >>> >>> >>> On 8/3/2016 4:11 AM, 'Pascal Jasmin' via Source wrote: >>> >>>> posting code before words, >>>> >>>> reduce2 =: (((&.>)/)(>@:))(@:(<"_1@:[ , <@:])) >>>> reduce3 =: ((((&.>)/)\.)(>@:))(@:(<"_1@:[ , <@:])) >>>> >>>> Rdot =: 2 : '>@:(u&.>(n aar 5!:0))@:(<"_1@:[ , <@:])' >>>> Rdot1 =: 2 : '>@:(u&.>(n aar 5!:0))@:(<"_1@:[ ,~ <@:])' >>>> >>>> + reduce2 >>>> >>>>> @:(+&.>/)@:(<"_1@:[ , <@:]) >>>>> >>>> + Rdot '/' >>>> >>>>> @:(+&.>/)@:(<"_1@:[ , <@:]) >>>>> >>>> + reduce2 >>>> >>>>> @:(+&.>/)@:(<"_1@:[ , <@:]) >>>>> >>>> + reduce3 >>>> >>>>> @:(+&.>/\.)@:(<"_1@:[ , <@:]) >>>>> >>>> + Rdot '/\.' >>>> >>>>> @:(+&.>/\.)@:(<"_1@:[ , <@:]) >>>>> >>>> They are grouped by equivalent use. Rdot1 reverses the order, but the >>>> only point of that seems to use (Rdot1 '/\') instead of Rdot '/\.' Rdot1 >>>> '/\' could easily have a reduce4 adverb "predefinition". >>>> >>>> >>>> The first thing you seem to be missing is using just / instead of /\. >>>> Its a much more common use. The next point is that Ndot1 probably should >>>> use /\ instead of /\. >>>> >>>> >>>> >>>> 1 2 + Rdot'/'~ 1 2 3 4 >>>> 11 12 >>>> 1 2 + Rdot'/\.'~ 1 2 3 4 >>>> 11 12 >>>> 10 11 >>>> 8 9 >>>> 5 6 >>>> 1 2 >>>> 1 2 + Rdot1'/\'~ 1 2 3 4 >>>> 1 2 >>>> 2 3 >>>> 4 5 >>>> 7 8 >>>> 11 12 >>>> >>>> Rdot1 isn't absolutely necessary because (u Rdot'/\.'~ |.) will produce >>>> all of the same items in reverse order. >>>> >>>> >>>> >>>> I don't think any other use case makes sense. And I don't see a monadic >>>> application making sense either. A monad would just use / or /\. or /\ >>>> instead. The other model is: >>>> >>>> >>>> reducE =: 1 : (':'; 'o=. x for_i. y do. o =. o u i end.') >>>> >>>> which is the same as u~ reduce2~ >>>> >>>> >>>> The next point to notice is that the pattern (adverb) (>@:)(@:(<"_1@:[ , >>>> <@:])) imposes a guarantee on its u argument to produce a consistent >>>> shape. In terms of looking for special code, there's just 2 necessary >>>> patterns on the left: (&.>/) or (&.>/\.) >>>> >>>> bit 1: if / and /\. are the only practical uses of this, then the result >>>> can always be unboxed at the end. because u&.>/ started with 2 boxes on. >>>> If u wants to add "extra" box layers, then u can do so, and it is up to u >>>> to figure out a consistent interpretation. Usually pretty straightforward, >>>> but I'd need to see a use case for bit1 "auto-boxing" that is diffucult to >>>> do in u. >>>> >>>> imo bit0 is not needed, but bit 2 is / or /\. . A 3rd conceivable use >>>> that may be too esoteric is instead of (<"_1@:[ , <@]) : >>>> <@(<\@:[ ,. <@]) or >>>> <@(<\.@:[ ,. <@]) >>>> >>>> >>>> this builds boxes of lists of boxes, and is different from the "core >>>> pattern" I described above. What seems to actually be the core pattern is >>>> the 2: >>>> >>>> ((&.>)/)(>@:)(list of boxings adverb) >>>> >>>> ((&.>)/\.)(>@:)(list of boxings adverb) >>>> >>>> where the "list of boxings adverb" could be limited to: >>>> >>>> @:(u(<"_1@:) , v(<@:)) and maybe >>>> @:(u(<"_1@:) ,~ v(<@:)) >>>> >>>> u and v can maybe even be limited to [ ] >>>> >>>> there's a similar pattern in ,&< ... We know that both sides (and that >>>> count = 2) were homogeneous prior to their boxings. In the case of >>>> >>>> >>>> (>@:)(list of boxings adverb) >>>> >>>> we know that u (to left of this adverb) must create a homogeneous result >>>> (or error). In addition to fold/scan operations, u can also be something >>>> like x&{ leaf. >>>> >>>> in the context of fold/scan, >>>> >>>> fold(initialstate, array, function) the u and v in the above pattern are >>>> initialstate and array. As you know, the optimization potential is that >>>> they never have to be boxed. The point of the rambling, is that there is a >>>> more general pattern in (>@:)(@:(boxing of 2 variables verb)) >>>> >>>> I'd recommend against putting an extra function parameter for twiddling >>>> (reversing) x or y. I think its better for user to pretweak them, or they >>>> can write/use a modifier that adds the functionality. >>>> >>>> >>>> about v, >>>> >>>> your implementation I think means that it can only be a noun, and so I >>>> think the result would always have a compatible shape, and so no need to >>>> box it. An alternative to a v parameter to function is special code for >>>> >>>> (v {"_1 (bound N.)), and then consider {. {: # without the "_1 >>>> restriction. >>>> (v {"1 _1 L:0 _ (bound N.)) might also solve the box/no box bit. >>>> >>>> >>>> A problem with having a v embedded parameter in the modifier is that it >>>> may be a function of the data. 90%+ of the time, you will want all of it. >>>> A selection formula might be (<@i.@#"_1 {"1 _1 leaf ]) even though the >>>> same (selection vector) value would most likely be generated for all >>>> items. Basically having a v parameter embedded in the modifier would mean >>>> instead of >>>> >>>> v&{&.> u&.>/\. (<"_1 y) , <x >>>> >>>> have >>>> >>>> v&.> u&.>/\. (<"_1 y) , <x >>>> >>>> This would let ] be a simple v parameter to get the full results. In >>>> terms of optimization, you may not need to care whether # or {. is used. >>>> The shape is not guaranteed linear either, so v may be much more complex >>>> than a noun argument to { . >>>> >>>> The v parameter is obviously not needed for / version. Seperate >>>> functions are good if you accept that both are useful. But you can also >>>> look at it as 3 function patterns >>>> >>>> u (((&.>)/)(>@:))(@:(boxing of 2 variables)) (reduce2) >>>> u reduce3(v&>@:) NB. /\. version >>>> >>>> u reduce3(v&.>@:) >>>> >>>> But for the latter 2, it may be better and simpler to do it through >>>> special code detection? If you call either >>>> >>>> (u reduce3)(v&.>@:) >>>> or >>>> >>>> v&.>@:(u reduce3) >>>> >>>> then v can get "optimized within the main loop" >>>> >>>> >>>> ----- Original Message ----- >>>> From: Henry Rich <henryhr...@gmail.com> >>>> To: Source forum <sou...@jsoftware.com> >>>> Sent: Tuesday, August 2, 2016 8:43 PM >>>> Subject: [Jsource] Proposal for new looping primitive x N. >>>> >>>> As Marshall once noted, the biggest deficiency in J is looping over an >>>> array when you need a result from each iteration, and the calculation >>>> requires an initial value and some internal state. Your code looks like >>>> >>>> result {"_1 f/\. array , initialstate >>>> >>>> where each execution of f produces a result value plus the internal >>>> state to feed into the next iteration. The problems are: >>>> * the result is the entire array of internal state, which is more, maybe >>>> MUCH more than you need, since the final result needs only a portion of >>>> the state >>>> * The state is probably not commensurate with a item of the array, so >>>> you end up boxing the initial state and the array items, which is very >>>> wasteful. >>>> >>>> I propose a new primitive, call it N. (for insert). N. is an adverb >>>> that produces a conjunction. In (x N.), x specifies options for the >>>> processing, much as the right operand of u;.n does. >>>> >>>> Definition: >>>> >>>> [x] u (n N.) v y >>>> >>>> where >>>> >>>> u is the function to be applied >>>> v is the selector to apply to the result of each execution of u, to >>>> produce the part saved in the final result >>>> x is the (optional) initial value (if omitted, f is applied first >>>> between the last 2 items of y) >>>> y is the argument array >>>> n selects from several variants: >>>> bit 0=0 operation goes back to front >>>> bit 0=1 operation goes front to back, as if using &.|. >>>> bit 1=0 selected result from each iteration becomes one item of >>>> result >>>> bit 1=1 selected result from each iteration is boxed before becoming >>>> an item of result >>>> >>>> Formal definition: >>>> Ndot0 =: 2 : 0 >>>> v&{@> u&.>/\. (<"_1 y) >>>> : >>>> v&{@> u&.>/\. (<"_1 y) , <x >>>> ) >>>> Ndot1 =: 2 : 0 >>>> v&{@> u&.>/\.&.|. (<"_1 y) >>>> : >>>> v&{@> u&.>/\.&.|. (<"_1 y) ,~ <x >>>> ) >>>> Ndot2 =: 2 : 0 >>>> v&{&.> u&.>/\. (<"_1 y) >>>> : >>>> v&{&.> u&.>/\. (<"_1 y) , <x >>>> ) >>>> Ndot3 =: 2 : 0 >>>> v&{&.> u&.>/\.&.|. (<"_1 y) >>>> : >>>> v&{&.> u&.>/\.&.|. (<"_1 y) ,~ <x >>>> ) >>>> >>>> Ndot =: 1 : 0 >>>> assert. m e. i. 4 >>>> select. m >>>> case. 0 do. Ndot0 >>>> case. 1 do. Ndot1 >>>> case. 2 do. Ndot2 >>>> case. 3 do. Ndot3 >>>> end. >>>> ) >>>> >>>> >>>> I look forward to criticism of this proposal. >>>> >>>> Henry Rich >>>> >>>> ---------------------------------------------------------------------- >>>> 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 > ---------------------------------------------------------------------- > 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