Item Amend is the monad form of }.  There is not an obvious reason to have the 
word amend (no updates take place) in that function either.  Maybe it should be 
called "sequential select"?.  I think the special code you are referring to 
applies to dyad m}.

Item amend being an adverb only because it shares the same } symbol complicates 
the use case Eel was looking to make of it (by preventing rank or ~ or other 
modifiers).


----- Original Message -----
From: Henry Rich <[email protected]>
To: [email protected]
Cc: 
Sent: Sunday, March 30, 2014 4:06:17 PM
Subject: Re: [Jprogramming] Item amend ~: index error.

I think somebody important must have used m}, because it was supported 
by special in-place code.

Henry Rich

On 3/30/2014 4:28 PM, Dan Bron wrote:
> Pascal wrote:
>> There is no good reason for item amend to be an adverb.
>
> Except that } , is an adverb (and there's a very good reason for that: to use 
> it for "regular amend" requires 3 distinct arguments, and verbs can't have 
> more than 2). That is, there's no way for the } in x } y to be a verb and yet 
> still have x idx} y work (because that requires } to be an adverb, not a 
> verb. The same symbol can't be an adverb sometimes and a verb other times).
>
> If you're instead saying that there's no reason for J to offer the 
> functionality of "item amend", or anyway it shouldn't be advertised in such a 
> prominent location as the monad u}, then I can only respond: what else should 
> go there?
>
> All verbs in J are ambivalent. That is, there is literally no way 
> (grammatically) to prevent a user from invoking a verb with one argument or 
> with two arguments. So either you provide meanings for both those cases or 
> you raise an error when the "wrong one" is invoked (viz ~. or E.). Therefore, 
> the choice is between defining u}y to mean something or raising an error when 
> someone tries that.
>
> I wouldn't find the argument that a error would be more useful than the 
> functionality offered by "item amend" to be very compelling. In fact, I 
> personally like "item amend", though I agree with you that it could have a 
> better name. I call it "merge" in my head, and my favorite use of it is this:
>
>     'X'&=`(,:&' ') } 'XXXhiXthereXXX!'
>     hi there   !
>
> That is, I use it for substitution. The v1 part provides a "merge mask" and 
> each item of the (output of) the v2 verb nominates candidates for each 
> position of the output. So v1 is the "voter" and v2 is the "ballot" and } is 
> the election (and so far has yet to stumble on any hanging chads...). In this 
> case, v0 is not present, but if it were, it would be ignored (so in this 
> case, it is the v0 part, not the v1 part, that is "unnecessary").
>
> But this merge thing is just a favorite toy of mine. It certainly is more 
> useful than a domain error, but I'm open to other ideas for what u} y should 
> mean, so long as they're not errors (that is: I won't mind if you ask me to 
> trade my toy for a new one, but I'd be quite vocally upset if you just took 
> it away).
>
> Similar thoughts apply to x m} y , though of course that's just regular 
> amend, not "item amend". You seem to think that it should have been defined 
> differently (or at least you state that with some confidence), so if you're 
> willing to make the case for a change by comparing the current implementation 
> with your new proposal across a variety of use cases, I'm willing to read it 
> (with an open mind).
>
> I've certainly used the idiom u@{`[`] } before ....
>
> -Dan
>
> PS: I've also also been quite embarrassed when I've confidently (ok: 
> arrogantly) asserted that I've come up with an "obviously superior" 
> improvement over one or another of Ken's design decisions, only to have its 
> flaws and failings wrt the current design graciously pointed out to me by 
> this community ... and now I tend not to do that, either :) [Seriously, some 
> of these guys have been at it since the 60s...]
>
> That said, the particular area of gerund} has always stuck out at me as 
> somewhat inconvenient, and even now it's one of the few patterns that I'm 
> forced to look up in the reference material before I can use it properly, so 
> I'm honestly quite open to other ideas here. We do own the J source now.
>
> That said, my understanding is that the current design of m} was based on a 
> desire to make it consistent and consonant with other, related areas on the 
> language, so if we change it, we might have to sacrifice that.
>
> Note also that I would be less open to ideas that make } less general. For 
> example, the current definition allows us to express u@{`[`] } , but 
> redefining v0`v1`v2} as (v0 v1 ])`v1} would preclude us from writing 
> everything the current definition permits, which would be a loss of 
> generality I (personally) would not accept.
>
> PPS: the confusion on both ^:(1 0 1"1) and the domain error below arises 
> (IMO) from an expectation of how rank applies "within" an operator, and this 
> expectation does not match the (current) implementation of J. That's what I 
> was driving at when I related them.
>
> For example, compare:
>
>     { b. 0. NB. Left rank zero: treat each box or atom on the left 
>independently
> 1 0 _
>
>     (+:@:])`[`]} b.0. NB. Left rank _: take all the boxes (or atoms) on left 
>together, all at once.
> _ _ _
>
>
>> On Mar 30, 2014, at 3:25 PM, Pascal Jasmin <[email protected]> wrote:
>>
>> I'm not sure this issue completely matches my difficulty with ^:1 0 1 
>> because that was  fixed with ^:[
>>
>> to be clear:
>>
>>    (0 0;1 1;2 2){ i.3 3
>> 0 4 8
>>
>>    (0 0;1 1;2 2) (+:@:])`[`]}i.3 3
>> |rank error
>>
>>    1 1 1 (0 0;1 1;2 2)}i.3 3
>> 1 1 2
>> 3 1 5
>> 6 7 1
>>
>>
>> The problem is actually with v0 and not v1... described/fixed below.  I 
>> agree that it is not a bug though:
>>
>> To expand on the questionable design decisions:
>>
>>
>> There is no good reason for item amend to be an adverb.
>> The problem with the gerund version of amend that Henry helped with is in 
>> v0.  It produces x v0 y and not x ([ v0 v1) y which would seem infinitely 
>> more useful.  The v2 part seems unnecessary.
>>
>> At any rate though:
>>
>>    (0 0;1 1;2 2)    (+:@:{)`[`]}i.3 3
>> 0 1  2
>> 3 8  5
>> 6 7 16
>>
>>
>>    +: amend (0 0;1 1;2 2) i. 3 3
>> 0 1  2
>> 3 8  5
>> 6 7 16
>>
>>
>>    (0 0;1 1;2 2)    (3 + {)`[`]}i.3 3
>> 3 1  2
>> 3 7  5
>> 6 7 11
>>
>>
>>
>> ----- Original Message -----
>> From: Dan Bron <[email protected]>
>> To: "[email protected]" <[email protected]>
>> Cc:
>> Sent: Sunday, March 30, 2014 1:34:27 PM
>> Subject: Re: [Jprogramming] Item amend ~: index error.
>>
>> I recommend cultivating a skepticism of the thought "this is a bug in J". 
>> It's a thought-stopping reaction, and almost always wrong.
>>
>> That's not to say J has no bugs: no, I mean "almost always" in the 
>> measure-theoretical sense; while I've found plenty of bugs in J, their 
>> number is absolutely dominated by the number of bugs I've found in my 
>> understanding of J. So now my first reaction is to debug my mental model 
>> before I try to debug J.
>>
>> Here's how I might approach that in your current case. First, I recognize 
>> that the argument to }, here, is a 3-element gerund, and the derived verb 
>> being invoked dyadically:
>>
>>> 3 +`((0 0;1 1;2 2)"1)`]} i.3 3
>>
>>
>> So I look up that case in the definition of } :
>>
>> x (v0`v1`v2)} y ↔️ (x v0 y) (x v1 y)} (x v2 y)
>>
>> Next, I would test this assertion the DoJ is making, against my current 
>> example:
>>
>>     x =: 3
>>     y=:i.3 3
>>
>>     v0=:+
>>     v1=:(0 0;1 1;2 2)"1
>>     v2=:]
>>
>>     m=: v0`v1`v2
>>
>>     benchmark=:x m} y
>>     test =:(x v0 y) (x v1 y)} (x v2 y)
>>
>>     test-:benchmark
>> 1
>>
>> So, since the results agree with each other, and therefore the Dictionary, 
>> there is no bug in J (at least not here). Which means, if I disagree with 
>> either result or the fact that they are identical, the bug must be in my 
>> mental model.
>>
>> Make sense?
>>
>> -Dan
>>
>> PS: I think I know what's confusing you, and it's related to your earlier 
>> frustration with ^:(1 0 1"_) .
>>
>> I have a half-written draft in response to that, but to treat it properly 
>> and clearly would take more time than I anticipated, so I didn't send it.
>>
>> The short story is that conjunctions and adverbs, for all their power, have 
>> on critical handicap with respect to verbs: they can't slice or dice their 
>> arguments. Conjunctions and adverbs always address arguments in toto; there 
>> is no (straightforward) way for them to operate piecewise. When you ask an 
>> operator to work piecewise, typically you'll just end up making multiple 
>> copies of the entire argument (as happens with ^:1 0 1).
>>
>> That's why we often say that the verb has primacy in J: most code is written 
>> as verbs and most tools assist in writing verbs. In fact, this is what 
>> adverbs and conjunctions are mostly intended to do: help write verbs, rather 
>> than stand by themselves (in the ideal J statement, you wouldn't even see 
>> the advs/conjs; they would fade into the background, so we could focus on 
>> the logic expressed by the verbs. Which is why we find trains so elegant and 
>> bicker about a better use for "hook", how and whether to interpret 
>> juxtaposed nouns, etc).
>>
>> The shining example here is: " . It is absolutely the most used conjunction 
>> in J (if you count implicit uses) and is designed precisely to let J verbs 
>> operate piecewise, in a straightforward, non-intrusive (often literally 
>> invisible) way.
>>
>> To let adverbs and conjunctions and adverbs operate piecewise (in a 
>> straightforward way), we'd need some kind of meta-" that could take 
>> operators as arguments, but currently no wordclass in J has higher 
>> precedence (binding power) than adverbs and conjunctions, so that's not 
>> possible.
>>
>>
>>>    On Mar 30, 2014, at 1:35 PM, Pascal Jasmin <[email protected]> 
>>>wrote:
>>>
>>> I'm sure your explanation is helpful to many, but the reason for my comment 
>>> comes from the natural frustrations of "I wish the computer would do what I 
>>> meant instead of what I say" moments and then the obvious consequence of 
>>> obviously "I don't always understand what I say.", which even if we all 
>>> acknowledge to be true, is not the foremost thought when 
>>> debugging/troubleshooting.
>>>
>>> ~ is the demon that will haunt beginners the most.  Passive is by far the 
>>> most common use of ~, and the most intuitively understandable (though all 3 
>>> are fairly quite straightforward), but its conceptually linked most 
>>> directly to Passive.
>>>
>>> I do not like or recommend the practice of replacing J primitives with 
>>> words such as 'verb define' because it obfuscates the parsing understanding 
>>> needed to read and write J.  However, in the case of ~, (though I don't do 
>>> it), it would have saved me many headaches if I had defined 3 adverbs and 
>>> used them.
>>>
>>> For interest what is said with: (i. 3 3) }~ (0 1 2) is:
>>>
>>> 0 1 2 (i. 3 3) } 0 1 2
>>>
>>>
>>> On another note, } is overly complicated, and IMO poorly designed, though 
>>> Eelvex's example is something I just learned today towards explaining it.
>>>
>>>
>>>      (0 1 2) } (i. 3 3)
>>>    0 4 8
>>>
>>>
>>> the above is incredibly cool, as it retrieves the diagonal from i. 3 3.  
>>> But note, the unfortunate asymetry with { which would have made a more 
>>> approachable design decision:
>>>
>>>     (0 1 2) { (i. 3 3)
>>> 0 1 2
>>> 3 4 5
>>> 6 7 8
>>>
>>>
>>> so, this happens:
>>>     1 (0 1 2) } (i. 3 3)
>>> 1 1 1
>>> 1 1 1
>>> 1 1 1
>>>
>>>     +: (0 1 2) } (i. 3 3)
>>> 0 8 16
>>>
>>>     (0 1 ) } (i. 3 3)
>>> |length error
>>> |       (0 1)}(i.3 3)
>>>
>>>     (0 1 ) { (i. 3 3)
>>> 0 1 2
>>> 3 4 5
>>>
>>>
>>> The key to understanding }'s behaviour is that m} has both a monadic and 
>>> dyadic verb result.  Which is completely unobvious for something called 
>>> amend.  (An intuitive imagination based understanding (as opposed to RTFM 
>>> based understanding which separates item amend from amend definitions) 
>>> would be that n} returns an adverb instead of a verb, which can then take u 
>>> or m to update y.
>>>
>>> I recommend using the following conjunction most of the time:
>>>
>>> amend_z_ =: 2 : 0  NB. v is n or n{"num
>>> s=. v"_ y
>>> (u"_ (s{y)) (s}) y
>>>    :
>>> s=. v"_ y
>>> (x u"_ (s{y)) (s}) y
>>> )
>>>
>>>
>>> Though it loses the quirky feature of obtaining the diagonal (Item Amend), 
>>> it gaI'm sure your explanation is helpful to many, but the reason for my 
>>> comment comes from the natural frustrations of "I wish the computer would 
>>> do what I meant instead of what I say" moments and then the obvious 
>>> consequence of obviously "I don't always understand what I say.", which 
>>> even if we all acknowledge to be true, is not the foremost thought when 
>>> debugging/troubleshooting.
>>>
>>> ~ is the demon that will haunt beginners the most.  Passive is by far the 
>>> most common use of ~, and the most intuitively understandable (though all 3 
>>> are fairly quite straightforward), but its conceptually linked most 
>>> directly to Passive.
>>>
>>> I do not like or recommend the practice of replacing J primitives with 
>>> words such as 'verb define' because it obfuscates the parsing understanding 
>>> needed to read and write J.  However, in the case of ~, (though I don't do 
>>> it), it would have saved me many headaches if I had defined 3 adverbs and 
>>> used them.
>>>
>>> For interest what is said with: (i. 3 3) }~ (0 1 2) is:
>>>
>>> 0 1 2 (i. 3 3) } 0 1 2
>>>
>>>
>>> On another note, } is overly complicated, and IMO poorly designed, though 
>>> Eelvex's example is something I just learned today towards explaining it.
>>>
>>>
>>>      (0 1 2) } (i. 3 3)
>>>    0 4 8
>>>
>>>
>>> the above is incredibly cool, as it retrieves the diagonal from i. 3 3.  
>>> But note, the unfortunate asymetry with { which would have made a more 
>>> approachable design decision:
>>>
>>>     (0 1 2) { (i. 3 3)
>>> 0 1 2
>>> 3 4 5
>>> 6 7 8
>>>
>>>
>>> so, this happens:
>>>     1 (0 1 2) } (i. 3 3)
>>> 1 1 1
>>> 1 1 1
>>> 1 1 1
>>>
>>>     +: (0 1 2) } (i. 3 3)
>>> 0 8 16
>>>
>>>     (0 1 ) } (i. 3 3)
>>> |length error
>>> |       (0 1)}(i.3 3)
>>>
>>>     (0 1 ) { (i. 3 3)
>>> 0 1 2
>>> 3 4 5
>>>
>>>
>>> The key to understanding }'s behaviour is that m} has both a monadic and 
>>> dyadic verb result.  Which is completely unobvious for something called 
>>> amend.  (An intuitive imagination based understanding (as opposed to RTFM 
>>> based understanding which separates item amend from amend definitions) 
>>> would be that n} returns an adverb instead of a verb, which can then take u 
>>> or m to update y.
>>>
>>> I recommend using the following conjunction most of the time:
>>>
>>> amend_z_ =: 2 : 0  NB. v is n or n{"num
>>> s=. v"_ y
>>> (u"_ (s{y)) (s}) y
>>>    :
>>> s=. v"_ y
>>> (x u"_ (s{y)) (s}) y
>>> )
>>>
>>>
>>> Though it loses the quirky feature of obtaining the diagonal (Item Amend), 
>>> it gains the feature of updating y in an intuitive (symetrical to {) way 
>>> that accepts a verb for the updating.
>>>
>>>     +: amend ( 1 2) i. 3 3
>>> 0  1  2
>>> 6  8 10
>>> 12 14 16
>>>
>>>
>>>     3 + amend 1 +: amend ( 1 2) i. 3 3
>>> 0  1  2
>>> 9 11 13
>>> 12 14 16
>>>
>>>
>>>
>>> the gerund } is weird too.  Here is a result I don't understand (might be a 
>>> bug?):
>>>
>>>      3 +`((0 0;1 1;2 2)"1)`]} i.3 3
>>> 9  1  2
>>> 3 10  5
>>> 6  7 11
>>>
>>>
>>>
>>> ----- Original Message -----
>>> From: Dan Bron <[email protected]>
>>> To: "[email protected]" <[email protected]>
>>> Cc:
>>> Sent: Sunday, March 30, 2014 9:16:51 AM
>>> Subject: Re: [Jprogramming] Item amend ~: index error.
>>>
>>> You can tell immediately whether ~ is performing passive, reflexive , or 
>>> evoke.
>>>
>>> Did you pass it a noun? Then it's evoke (this is very rare and very 
>>> obvious: remember, as an adverb, ~'s argument is fixed at runtime, so you'd 
>>> literally have to write or see a noun directly to the left of ~).
>>>
>>> You didn't pass it a noun? Ok, by definition, you passed it a verb. So ~ 
>>> consumed that verb and produced a new verb. Did you pass that new verb one 
>>> argument, or two arguments?
>>>
>>> If you passed the new verb one argument (aka "invoked the monad") then ~ 
>>> will act in its reflexive capacity. If you passed the new verb two 
>>> arguments (aka "invoked the monad") then ~ will act in its passive capacity.
>>>
>>> In other words, f~ ↔️ (] f ]) : (] f [) . That is, given a verb f, f~ will 
>>> produce an ambivalent verb which will always invoke the dyadic valence of f 
>>> (the monadic valence of f is thus ignored and therefore irrelevant). When 
>>> f~ is invoked, the left argument to f will always be the right argument of 
>>> f~ .
>>>
>>> Thus, the only difference between passive and reflexive is the right 
>>> argument to f, which will be the left argument of f~ if it has one (ie if 
>>> f~ was invoked dyadically) or the same old right argument as before if it 
>>> doesn't (ie if f~ was invoked monadically and the only argument around to 
>>> use is on the right).
>>>
>>> So ~ is hardly a demon from hell, because you know what you're getting when 
>>> you invoke it. The incantations are simple and the consequences predictable.
>>>
>>> -Dan
>>>
>>> Ok, need a mnemonic?
>>>
>>> 'name'~ : evoke the name (call upon, summon up, conjure, recall)
>>>
>>> verb~ y : reflect the argument (mirror, create a perfect image, clone, put 
>>> a mirror up so the verb sees two identical copies, etc)
>>>
>>> x verb~ y : use the passive voice (switch the subject and object, invert 
>>> the sentence, etc):
>>>
>>> Pascal invoked Astaroth
>>> Astaroth was invoked by Pascal
>>>
>>> [do not try this at home]
>>>
>>> [1] "Why was ~ on a dyadic verb named "passive"?
>>>      http://www.jsoftware.com/pipermail/general/2007-May/030070.html
>>>
>>>
>>> Sent from my iPhone
>>>> On Mar 30, 2014, at 8:31 AM, Pascal Jasmin <[email protected]> wrote:
>>>>
>>>> } is an adverb.
>>>> ~ is a demon from hell for errors in that it can do one of 3 things 
>>>> (passive, reflex, evoke), and often its one of the other 2 than you 
>>>> intended.  (here you were assuming it would do passive).  I'm not 100% 
>>>> positive which of the other 2 it actually gets parsed at here.
>>>>
>>>>
>>>> ----- Original Message -----
>>>> From: EelVex <[email protected]>
>>>> To: Programming forum <[email protected]>
>>>> Cc:
>>>> Sent: Sunday, March 30, 2014 7:07:05 AM
>>>> Subject: [Jprogramming] Item amend ~: index error.
>>>>
>>>>       (0 1 2) } (i. 3 3)
>>>> 0 4 8
>>>>
>>>>       (i. 3 3) }~ (0 1 2)
>>>> |index error
>>>> |       (i.3 3)}~(0 1 2)
>>>>
>>>> Why? What's the use of }~ when not used as 'amend'?
>>>> ----------------------------------------------------------------------
>>>> 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
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to