Could you clarify this statement "I'm still interested in the guard conjunction that I don't understand why it doesn't work"?
I am not sure what you mean by "why it doesn't work". But let's say that y was 1 2 3 and that sideff y was 14. In that case, these would be equivalent statements: if. -. (2 = sideff y)"_ ^: (*./ y) 1 do. 'bad' return. end. if. -. (2 = sideff 1 2 3)"_ ^: (*./ 1 2 3) 1 do. 'bad' return. end. if. -. (2 = 14)"_ ^: (6) 1 do. 'bad' return. end. if. -. (0)"_ ^: (6) 1 do. 'bad' return. end. if. -. (0)"_ (0)"_ (0)"_ (0)"_ (0)"_ (0)"_ (1) do. 'bad' return. end. if. -. 0 do. 'bad' return. end. if. 1 do. 'bad' return. end. 'bad' return. You might want to try walking through a similar exercise with sideff bind y Thanks, -- Raul On Wed, Jan 15, 2014 at 1:08 AM, Pascal Jasmin <godspiral2...@yahoo.ca> wrote: > that kind of works. It turns the expression from a noun to a fork. > > I'm still interested in the guard conjunction that I don't understand why it > doesn't work. > > thanks. > > > ----- Original Message ----- > From: Raul Miller <rauldmil...@gmail.com> > To: Programming forum <programm...@jsoftware.com> > Cc: > Sent: Wednesday, January 15, 2014 12:37:08 AM > Subject: Re: [Jprogramming] maybe a bug in short circuiting. Help with a > guard structure > > 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 <godspiral2...@yahoo.ca> > 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 <rauldmil...@gmail.com> >> To: Programming forum <programm...@jsoftware.com> >> 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 <godspiral2...@yahoo.ca> >> 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 > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm