Oops, you are correct, and I was wrong. I should have tested against an example.

Anyways, a fix that retains your result pattern would be to replace
sideff y with sideff bind y (this will defer execution until you
receive the 1, which you will then ignore).

I might be able to some up with something more elegant, but I'd want
test cases to play with before I make further mistakes.

Thanks,

-- 
Raul



On Wed, Jan 15, 2014 at 12:21 AM, Pascal Jasmin <[email protected]> wrote:
> the 1 at the end does something useful:  m"_ ^: n 1 will return 1 if n is 0 
> or m is 1.
>
> The overall pattern seems very common to me:  "if query1 has items then if 
> not also subquery is true signal error and exit function"
>
> I understand the confusion over my using y, but I was mostly trying to 
> illustrate noun expressions, and I understand now that it may not be possible.
>
> My main question was in the second part, and asking why the 'guard' 
> conjunction doesn't work.
>
>
> ----- Original Message -----
> From: Raul Miller <[email protected]>
> To: Programming forum <[email protected]>
> Cc:
> Sent: Tuesday, January 14, 2014 11:38:12 PM
> Subject: Re: [Jprogramming] maybe a bug in short circuiting. Help with a      
>   guard structure
>
> Yes.
>
>> if. -. (2 = sideff y)"_ ^: (*./ y) 1 do. 'bad' return. end.
>
> J needs to resolve the contents of the parenthesis to a single entity
> (noun, verb, adverb or conjunction).
>
> In this case I think you want a verb, which would be controlled by ^:
>
> Also, I do not see that that "_ does anything useful for you.
>
> So, to accomplish what I think you are describing, I would get rid of
> the 'y' in the places it currently exists on that line. That would
> give you verb phrases inside both of the parenthesis where currently
> you have noun phrases. I would also delete the "_
>
> Then, I would replace that 1 with y. The 1 currently does nothing
> useful and you want y as the argument for both of your verb phrases.
>
> Does this line of reasoning make sense to you?
>
> Thanks,
>
> --
> Raul
>
>
> On Tue, Jan 14, 2014 at 11:13 PM, Pascal Jasmin <[email protected]> 
> wrote:
>> the following attempts to code the one line pattern with one less if. :
>> if. test1 y do. if. -. test2 x do. 'test2 failed' return. end. end.
>>
>> The problem is that the verb sideff is called even if it shouldn't be.
>>
>> test=: 3 : 0
>> if. -. (2 = sideff y)"_ ^: (*./ y) 1 do. 'bad' return. end.
>> )
>> sideff =: 3 : 'a=: +/ y'
>>
>>
>>    test 1 2
>> bad
>>    a
>> 3
>>    test 1 1
>>    a
>> 2
>>    test 1 0
>>    a
>> 1
>>
>> is this just due to nature of parentheses, and the interpreter needing to 
>> parse what is on other side of "_
>>
>>
>> This works as a one liner including shortcircuiting out the side effect when 
>> appropriate :
>>
>>    3 (2 = sideff)@:[ ^: (* 0) 1
>> 1
>>    3 (2 = sideff)@:[ ^: (* 1) 1
>> 0
>>    2 (2 = sideff)@:[ ^: (* 1) 1
>> 1
>>
>> but I don't understand why this fails:
>>
>> guard =: 2 : 0
>> :
>> (u@:[)^: (v y) 1
>> )
>>
>>    3 (2 = sideff) guard *  1
>> 0
>>    2 (2 = sideff) guard *  1  NB. should be 1
>> 0
>>
>> is there a way to define guard to properly short circuit and give the right 
>> answer?  Is it impossible if the u argument evaluates to a noun as it was 
>> used in first example?
>> ----------------------------------------------------------------------
>> 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