Spurious value error in J6.01 betas:

           4 : 'x =. x , y'
        4 : 'x =. x , y'
        |value error: y
        |       4 :'x =. x , y'

A simpler example is just  3 :'y=.y,y'  .  Note that even though the error is 
thrown, the verb is still returned.

I was writing a verb that accumulates data in a global buffer (because it's 
called asynchronously).  If I don't define (assign to) the buffer before I 
define the verb in the script, I get the spurious error:

           _1 -: nc {.;:'BUFFER'  NB.  BUFFER  is undefined 
        1

           async =: 3 : 'BUFFER =: BUFFER , y'
        |value error: y
        |   async=:    3 :'BUFFER =: BUFFER , y'


           async   NB.  Verb was still assigned
        3 : 'BUFFER =: BUFFER , y'
           
I think this is related to the new append-in-place smarts, because other forms 
don't trigger the bug:

           v0 =: 3 : 'y'
           v1 =: 3 : 'BUFFER , y'
           v2 =: 3 : 'BUFFER =: y'
           v3 =: 3 : 'BUFFER =: BUFFER , y'
        |value error: y
        |   v3=:    3 :'BUFFER =: BUFFER , y'
           v4 =: 3 : 'BUFFER =: y , BUFFER'
           v5 =: 3 : 'BUFFER =: BUFFER , BUFFER'
        |value error: BUFFER
        |   v5=:    3 :'BUFFER =: BUFFER , BUFFER'
           v5 =: 3 : 'BUFFER =: BUFFER , 0'

Note (from second transcript) that even if the spurious error is thrown, the 
verb still gets defined.   If this verb is invoked, another surprise occurs:

           async 'hello'
        |domain error: async
        |   BUFFER=:BUFFER    ,y

Why is this a domain error?  I expect a value error.

  BUFFER  is an undefined name, so it should be treated as a verb.  If   BUFFER 
 were really a verb, it would be invoked monadically with the argument  ,y  
(the ravel of  y  ), the result of which would then be assigned to   BUFFER  , 
changing its nameclass to noun.  But, since  BUFFER  is not defined, I expect 
that monadic invocation to fail with a value error.

I would expect a domain error if I invoked  v4 'hello'  because of J6's new NVV 
train (meaning v4 would try to return a verb), but that's not the case in  
async  .

Is this a bug?  I hesitate to assert so because whenever I report a "misspelled 
error" I'm told it's not a bug.  But consider:

           _1=nc ;:'BUFFER OTHER'  NB. Both undefined
        1 1
           3 : 'BUFFER , 22' 0
        |value error: BUFFER
        |       BUFFER,22
           3 : 'OTHER =: BUFFER , 22' 0
        |value error: BUFFER
        |   OTHER=:    BUFFER,22
           3 : 'BUFFER =: OTHER , 22' 0
        |value error: OTHER
        |   BUFFER=:    OTHER,22
           3 : 'BUFFER =: BUFFER , 22' 0
        |domain error
        |   BUFFER=:BUFFER    ,22

If it's not a bug, I would appreciate an explicit explanation of the reason.

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

Reply via email to