I guess this is not lazy evaluation, but a problem of reference, in the
sentences b=: a or b=: a;c
there is no value-copying at this point, only the reference count of 
data block of a or c increases and header of b points to that data. Normally
when a is updated eg, a=: a+1, then the tie between a and b will break. The
reported bug seems to be related to the inability to detect a has been
changed and the old data block is no long valid.

   a=: 2 ]/\ i.4
   smoutput a
0 0 7995393                
NB. a reference to the data block of i.4 which has been released

   a=: 2 ]/\ b=: i.4
   smoutput a
1 2 3
NB. no error since data block pointed by b is still valid

   b=: i.4   NB. change memory address of data block
   smoutput a
0 0 6356993
NB. same error
 
   a=: a:{ 2 ]/\ i.4
   smoutput a
1 2 3
NB. no error because a is copy-by-value using a:{

Втр, 17 Май 2011, Ian Shannon писал(а):
> Roger,
> 
> From the example below, it appears that the correct processing is being done, 
> it is just when assigning a name to the results that your special code runs 
> into trouble,  OR  the  J system is doing some lazy evaluation.
> "In certain cases, instead of explicitly doing }:y and }.y, the code 
> constructs headers which point to the same data, thereby saving time and 
> space."
> 
> Does J do lazy evaluation, that is delaying a calculation until needed with 
> the potential of not doing a calculation if the result is not used?
> 
> Playing around with 2 infix below has given me a bit more insight into J.
> 
> 
>    1 load '~temp/3.ijs'
>    NB. Script showing infix2 problem and exploring what happens
>    NB. when you do nothing.
>    NB. Running from a script using
>    NB.     1 load   'script_file.ijs'
>    NB. can produce vastly different "wrong" values, and the second set
>    NB. of a, b and c are all not identical.
>    NB. Entering the sentence 'c =: 0 + b =:  a' at the keyboard 
>    NB. produced identical results for a, b and c
>    
>       JVERSION
> Engine: j701/2011-01-10/11:25
> Library: 7.01.048
> Platform: Win 32
> Installer: j701a_win.exe
> InstallPath: r:/j701
>    
>       NB. simple expression which produces the error.
>       
>       c =: 0 + b =:  a=: 2 ]/\ i. n =: 8
>       a                      NB. wrong
> 23816912 23860120 16144024 16003072 16003072 17745504 16001920
>       b                      NB. wrong
> 23816912 23860120 16144024 16003072 16003072 17745504 16001920
>       c                      NB. correct
> 1 2 3 4 5 6 7
>       NB. adding 0 produces the correct answer
>       NB. But if we use the value a without the infix calculation
>       c =: 0 + b =:  a
>       a                      NB. wrong
> 23816912 23860120 16144024 16003072 16003072 17745504 16001920
>       b                      NB. same wrong
> 23816912 23860120 16144024 16003072 16003072 17745504 16001920
>       c  NB. same wrong @ keyboard, maybe different wrong from script
> 23816912 23860120 16144024 16003072 16003072 17745504 16001920
>       NB.  My guess is "c" values are normalised floating point values
>       NB.  and "a" and "b" are un-normalised floats.
>       
>       NB. My conclusion is that it is the assignment and not the calculation 
>       NB. introducing the error.   J  'knows' what the answer should be so
>       NB. it uses Roger's quick headers, but carries the calculated value
>       NB. along and when asked to add 0 it produces the correct value
>       NB. for the calculated value to put into "c"
>    
>    
>       NB. instead of adding 0 try identity verb between "a" and "b"
>       c =: 0 + b =: ] a=: 2 ]/\ i. n
>       a                      NB. wrong
> 23816912 23860120 16144024 16003072 16003072 17745504 16001920
>       b                      NB. wrong
> 23816912 23860120 16144024 16003072 16003072 17745504 16001920
>       c                      NB. correct
> 1 2 3 4 5 6 7
>       NB. Doing identity (ie nothing) makes no difference.
>       NB. Same result when doing nothing a finite number of times 
>       
>       c =: 0 + b =: ]^:25  a=: 2 ]/\ i. n
>       a                      NB. wrong
> 23816912 23860120 16144024 16003072 16003072 17728352 16001920
>       b                      NB. wrong
> 23816912 23860120 16144024 16003072 16003072 17728352 16001920
>       c                      NB. correct
> 1 2 3 4 5 6 7
>       
>       c =: 0 + b =: ]^:1e6  a=: 2 ]/\ i. n
>       a                      NB. wrong
> 23816912 23860120 16144024 16003072 16003072 17745504 16001920
>       b                      NB. wrong
> 23816912 23860120 16144024 16003072 16003072 17745504 16001920
>       c                      NB. correct
> 1 2 3 4 5 6 7
>    
>    
>       NB. or even doing the inverse of nothing
>       c =: 0 + b =: ]^:_1  a=: 2 ]/\ i. n
>       a                      NB. wrong
> 23816912 23860120 16144024 16003072 16003072 17728352 16001920
>       b                      NB. wrong
> 23816912 23860120 16144024 16003072 16003072 17728352 16001920
>       c                      NB. correct
> 1 2 3 4 5 6 7
>       
>       NB. however doing something zero time gives different results
>       c =: 0 + b =: *~^:0  a=: 2 ]/\ i. n
>       a                      NB. wrong
> 23860120 16144024 16003072 16139800 23817168 16003136 16144024
>       b                      NB. correct
> 1 2 3 4 5 6 7
>       c                      NB. correct
> 1 2 3 4 5 6 7
>       
>       NB. as does doing nothing an infinite number of times
>       c =: 0 + b =: ]^:_  a=: 2 ]/\ i. n
>       a                      NB. wrong
> 23816912 23860120 16144024 16003072 16003072 17728352 16001920
>       b                      NB. correct
> 1 2 3 4 5 6 7
>       c                      NB. correct
> 1 2 3 4 5 6 7
>       
>       NB. or the inverse of nothing an infinite number of times
>       c =: 0 + b =: ]^:__  a=: 2 ]/\ i. n
>       a                      NB. wrong
> 23816912 23860120 16144024 16003072 16003072 17726304 16001920
>       b                      NB. correct
> 1 2 3 4 5 6 7
>       c                      NB. correct
> 1 2 3 4 5 6 7
>       
>       
>       NB.  Neville Holmes in the days of the Sydney APL user group
>       NB.  gave a very entertaining talk on "nothing"  in APL
>       NB.   ( Where are you now Neville! )
>       NB.  demonstrating how well array languages (that is APL)
>       NB.  handled arrays of zero rank and zero length.
>       NB. J's  power conjunction provides me with more delights.
>       
>       NB.  Further exploring this shows that the inverse of the
>       NB. "do nothing verb" applied more than once does affect
>       NB.  the value transferred.
>       NB.  Hence the conclusion that (for current J system) there
>       NB.  is somehow a difference between doing nothing and
>       NB.  doing the inverse of nothing when applied more than once!
>    
>       NB.  Some defined verbs for doing nothing will do exactly that
>       NB.  - maintaining the same state - and
>       NB. others return the correct value which shows they are
>       NB. collecting the calculation and not being effectively bypassed. 
>    
>       
>    
> 
> 
> 
> Ian
> Ian Shannon
> Landscape Modelling & Decision Support
> Scientific Services
> Office of Environment and Heritage
> Department of Premier and Cabinet
> PO Box A290
> Sydney South
> NSW      1232
> T: +61 2 99 955 490
> E:  Ian.Shannon    Environment nsw gov au     (you add in 'dot's and 'at')
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
> This email is intended for the addressee(s) named and may contain 
> confidential and/or privileged information. 
> If you are not the intended recipient, please notify the sender and then 
> delete it immediately.
> Any views expressed in this email are those of the individual sender except 
> where the sender expressly and with authority states them to be the views of 
> the Office of Environment and Heritage, NSW Department of Premier and Cabinet.
> 
> PLEASE CONSIDER THE ENVIRONMENT BEFORE PRINTING THIS EMAIL
> 
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm

-- 
regards,
====================================================
GPG key 1024D/4434BAB3 2008-08-24
gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to