[Jprogramming] intermediate tacit result assignments

Linda Alvord lindaalvord at verizon.net
Fri Mar 21 01:37:27 UTC 2014


Sorry about the 3 identical copies.  Linda


----Original Message-----
From: programming-bounces at forums.jsoftware.com [mailto:programming-bounces at forums.jsoftware.com] On Behalf Of Linda Alvord
Sent: Thursday, March 20, 2014 8:40 PM
To: programming at jsoftware.com
Subject: Re: [Jprogramming] intermediate tacit result assignments

When I changed my script from a  3:  to 4:  It works much better!

    5 (4 : 'C' + [ 4 : 'C =: x * y' ] ) 13 130
   f=: 4 : 'C =: x * y'
   NB.f 13   result is domain error
   g=: 4 : 'C =: x * y']
   g 13
169
   C
169
   g=: 4 : 'C =: (A=:x) * y']
   erase 'C'
1
   g 13
169
   C
169
   A
13
   (3 : 'C' + [ 4 : 'C =: x * y' ] ) 13
338
   h=: 13 : 'C' + [ 4 : 'C =: x * y' ] 
   erase 'C'
1
   h 13
338
   h
169"_ + [ 4 : 'C =: x * y' ]
   C
169
   erase 'C'
1
   5 (4 : 'C' + [ 4 : 'C =: x * y' ] ) 13 130
   C
65

See the next post.

Linda

-----Original Message-----
From: programming-bounces at forums.jsoftware.com [mailto:programming-bounces at forums.jsoftware.com] On Behalf Of Pascal Jasmin
Sent: Thursday, March 20, 2014 11:24 AM
To: programming at jsoftware.com
Subject: Re: [Jprogramming] intermediate tacit result assignments

oh...

      5    (4 :'C'+[4 :'C =: x * y'])13
130

a  quirk in the approach is that you need to be careful with the get as 3 : or 4 :

Here is an alternate version of fset (dyad only)

fset =: 3 : 'C=:  y'

   5 (4 : 'C' +  fset@:* ) 13 2
130 20
   C
65 10

   5 (4 : 'C' + [ fset@* ] ) 13 2
75 20
   C
10

using names are optional: parens not required for using inline :
  5 (fget + [  3 : 'C=:  y' @:* ] ) 13 2
130 20

Just as the above definition is equivalent to (*+*)

   5 (fget + * fset@:+ ***) 13 2
8580 220

is equivalent to:

   5 ((* + ***) + * + ***) 13 2
8580 220

   5 (4 : 'C' + * 3 : 'C=:  y'@:+ ***) 13 2
8580 220



----- Original Message -----
From: Linda Alvord <lindaalvord at verizon.net>
To: programming at jsoftware.com
Cc: 
Sent: Thursday, March 20, 2014 10:55:09 AM
Subject: Re: [Jprogramming] intermediate tacit result assignments

In my example,   13 was not the domain error, rather  5 f 13  was.

Linda

-----Original Message-----
From: programming-bounces at forums.jsoftware.com [mailto:programming-bounces at forums.jsoftware.com] On Behalf Of Pascal Jasmin
Sent: Thursday, March 20, 2014 7:45 AM
To: programming at jsoftware.com
Subject: Re: [Jprogramming] intermediate tacit result assignments

f 13 is a domin error bc f is dyadic ( 4 : ...)

usually the fork ([ f ]) 13 is equivalent to f 13, but the one difference is that though x[ y is x, ] y(monadic) is y.  So ([ f ]) 13 is 13 f 13 instead of domain error.

> Be careful as C may be using an earlier value.

The point of the exercise was to always set that value.  Your h function does not set C.

A simpler version of the example

fget =: 4 : 'C'
fset =: 4 : 'C =: x * y'
  2 (fget + fset) 3
12


----- Original Message -----
From: Linda Alvord <lindaalvord at verizon.net>
To: programming at jsoftware.com
Cc: 
Sent: Thursday, March 20, 2014 5:34:16 AM
Subject: Re: [Jprogramming] intermediate tacit result assignments

Here’s how I studied you example.


    (3 : 'C' + [ 4 : 'C =: x * y' ] ) 13
338
   f=: 4 : 'C =: x * y'
   NB.f 13   result is domain error
   g=: 4 : 'C =: x * y']
   g 13
169
   C
169
   g=: 4 : 'C =: (A=:x) * y']
   erase 'C'
1
   g 13
169
   C
169
   A
13
   (3 : 'C' + [ 4 : 'C =: x * y' ] ) 13 
338
   h=: 13 : 'C' + [ 4 : 'C =: x * y' ] 
   erase 'C'
1
   h 13
338
   h
169"_ + [ 4 : 'C =: x * y' ]
   C
169
   erase 'C'
1
   5 (3 : 'C' + [ 4 : 'C =: x * y' ] ) 13
|domain error
|   5    (3 :'C'+[4 :'C =: x * y'])13
|[-18] 
   C
65

Be careful as C may be using an earlier value.

Linda


-----Original Message-----
From: programming-bounces at forums.jsoftware.com [mailto:programming-bounces at forums.jsoftware.com] On Behalf Of km
Sent: Tuesday, March 18, 2014 5:53 PM
To: programming at jsoftware.com
Subject: Re: [Jprogramming] intermediate tacit result assignments

Have a look at the diagrams for Hook and Fork in

http://www.jsoftware.com/docs/help801/dictionary/dictf.htm

--Kip Murray

Sent from my iPad

> On Mar 18, 2014, at 2:15 PM, Pascal Jasmin <godspiral2000 at yahoo.ca> wrote:
> 
> to be clear, I am in no way asking for how to double a product.
> 
> what the function is actually equivalent to, though is: (*+*)  
> 
> What seems interesting about the function is it is doing something I previously thought was impossible.  Saving and reusing intermediate (noun) results in a tacit function.  
> 
> It behaves as expected, though I am only concerned about not hitting domain errors, and that the intermediate assignment is picked up when trying to retrieve it.  The expression is meant to be as simple as possible other than the title's feature.
> 
> 
> 
> ----- Original Message -----
> From: Raul Miller <rauldmiller at gmail.com>
> To: Programming forum <programming at jsoftware.com>
> Cc: 
> Sent: Tuesday, March 18, 2014 2:37:26 PM
> Subject: Re: [Jprogramming] intermediate tacit result assignments
> 
> Here's another function which achieves that end:
> 
> test9=: 2 * *
> 
> One interesting thing though, when comparing different expressions which
> accomplish the same end, has to do with how their components can be used
> differently.
> 
> And there's something to be said for having a wide variety of components.
> (Not all of those things to be said are good things, though some are.)
> 
> But consider, for example:
> 
>    1 2 3 (4 : 'c' + 4 : 'c =: x * y')"2 p:i.3 3
>   4   6  10
> 28  44  52
> 102 114 138
>    c
> 2  3  5
> 14 22 26
> 51 57 69
>    1 2 3 (4 : 'c' + 4 : 'c =: x * y')"1 p:i.3 3
> 4 12  30
> 14 44  78
> 34 76 138
>    c
> 17 38 69
>    1 2 3 (4 : 'c' + 4 : 'c =: x * y')"0 p:i.3 3
>   4   6  10
> 28  44  52
> 102 114 138
>    c
> 69
> 
> Is that how you expected it to behave?
> 
> (Notice, in particular, how the "off-diagonal" elements for your expression
> at rank 1 are different from those of the same expression at rank 0 and
> rank 2. There's a simple explanation for this, but - like most realizations
> - it's only obvious in retrospect.
> 
> Thanks,
> 
> -- 
> Raul
> 
> 
> 
> 
> On Tue, Mar 18, 2014 at 1:47 PM, Pascal Jasmin <godspiral2000 at yahoo.ca>wrote:
> 
>> interesting function, Raul, but not quite what I was doing:
>> 
>>     test8 =: 4 : 'c' + [ 4 : 'c =: x * y' ]
>> 
>> function simply multiplies x and y and then doubles result.  Its a 5
>> element train where the : conjunctions makes single train elements.   The
>> point is doing this with potntial side effects and saved intermediate
>> results, which has escaped my previous attempts at such possibilities.
>>   Rank modification is relatively easy, though may require parens.
>> 
>> perhaps clearer with parens:  (4 : 'c') + [ (4 : 'c =: x * y') ]
>> 
>>     2 test8 3
>> 12
>>     c
>> 6
>>     2 test8 3 2 1
>> 
>> 12 8 4
>>     c
>> 6 4 2
>> 
>> 
>> ________________________________
>> From: Raul Miller <rauldmiller at gmail.com>
>> To: Programming forum <programming at jsoftware.com>
>> Sent: Tuesday, March 18, 2014 1:25:32 PM
>> Subject: Re: [Jprogramming] intermediate tacit result assignments
>> 
>> 
>> It's not clear to me what you want to accomplish here - no sample data, no
>> results. Also note that while this is, in a sense, tacit, you'll get some
>> ... interesting (and probably unintended) behaviors if you try using your 3
>> : and/or 4 : verbs with rank.
>> 
>> I've got some code I'm working on which uses variables in a tacit
>> expression. Here's an example:
>> 
>> mergetable=:2 :0
>> :
>>    tinds=. 1+i.#m
>>    ginds=. -1+i.#n
>>    tlen=. {:@$x
>>    glen=. {:@$y
>>    mergecol=. [:`tonly`both`gonly at .(3&#.@:*)
>>    tget=. {&x@<:@{.@(#~ 0&<)
>>    gget=. {&y@<:@|@{.@(#~ 0&>)
>>    tnul=. (tlen#a:)"_
>>    gnul=. (glen#a:)"_
>>    tonly=. tget,gnul
>>    gonly=. tnul,gget
>>    both=. tget,gget
>>    (m,n) mergecol/. tinds,ginds
>> )
>> 
>> Example use:
>> 
>>     (i. 4 3) (;:'this is a test') mergetable (;:'that is not like
>> this')&:(]each) p:i.5 2
>> ┌─┬──┬──┬──┬──┐
>> │0│1 │2 │23│29│
>> ├─┼──┼──┼──┼──┤
>> │3│4 │5 │5 │7 │
>> ├─┼──┼──┼──┼──┤
>> │6│7 │8 │  │  │
>> ├─┼──┼──┼──┼──┤
>> │9│10│11│  │  │
>> ├─┼──┼──┼──┼──┤
>> │ │  │  │2 │3 │
>> ├─┼──┼──┼──┼──┤
>> │ │  │  │11│13│
>> ├─┼──┼──┼──┼──┤
>> │ │  │  │17│19│
>> └─┴──┴──┴──┴──┘
>>     ~.;:'this is a test that is not like this'
>> ┌────┬──┬─┬────┬────┬───┬────┐
>> │this│is│a│test│that│not│like│
>> └────┴──┴─┴────┴────┴───┴────┘
>> 
>> In other words, this addresses the problem of "given two tables with
>> different column headers, build a bigger table with combined headers and
>> all the rows from each table."
>> 
>> I put the table on its side (so columns are J items), but the interesting
>> thing, here, is that I am using numeric indices to refer to external data.
>> You'd want to transpose the table to show rows and columns more
>> traditionally. (I'm using boxes here because "in real life" I am working
>> with text rather than numbers.)
>> 
>> This particular example allowed me to use (in this case) J's /. adverb
>> without actually asking it to manipulate the data which I am grouping
>> together. (Though in this particular example, I've brought everything
>> together in the final result - this let me use J's error detection features
>> in a way which would not have worked if I had left the data in external,
>> "explicit" contexts.)
>> 
>> Thanks,
>> 
>> --
>> Raul
>> 
>> 
>> 
>> 
>> On Tue, Mar 18, 2014 at 12:26 PM, Pascal Jasmin <godspiral2000 at yahoo.ca
>>> wrote:
>> 
>>> Here is a neat way to get intermediate results within a tacit expression.
>>>   Many drawbacks, but it is possible.  Drawbacks include global variables,
>>> and dyad vs. monad must be known prior to access:
>>> 
>>> 3 : 'c' + [ 4 : 'c =: x * y' ]
>>> 
>>> That may not look very tacit, but it is :P  intermediate result c is
>>> accessed later in the fork.
>>> 
>>> the biggest drawback is accessing the result (3 : 'c')  If the access is
>>> in a dyadic part of the expression, it needs to be (4 : 'c')
>>> 
>>> Any improvements?
>>> ----------------------------------------------------------------------
>>> 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
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

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



More information about the Programming mailing list