On Sat, 13 Oct 2012, Allin Cottrell wrote: > On Sat, 13 Oct 2012, Logan Kelly wrote: > >> I am using GRETL 1.9.9 on a Win 7 64bit machine. I found a quirk that may >> be a bug. I found that >> >> bundle BundleOfMatrixs >> matrix BundleOfMatrixs["test"] = {} >> matrix test = {1,2,3,4} >> BundleOfMatrixs["test"] |= test >> >> yields the following error message >> >> '|=' : only defined for matrices >> >> Error executing script: halting >>> BundleOfMatrixs["test"] |= test >> >> but that >> >> bundle BundleOfMatrixs >> matrix BundleOfMatrixs["test"] = {} >> matrix test = {1,2,3,4} >> BundleOfMatrixs["test"] = BundleOfMatrixs["test"]|test >> >> works just fine. > > Hmm, not sure this is a bug. This basic idea with bundles is that > if you want to do anything with a matrix (or any other sort of > object) from inside the bundle you have to extract it first (which > makes a copy of the object). > > At first I was a little surprised that even your second > formulation worked, but on reflection it's OK: on the right hand > side, BundleOfMatrixs["test"] produces an anonymous matrix which > is a copy of the one in the bundle, to which you concatenate > another matrix; then the "=" operation replaces the bundle content > under the key "test" with the new right-hand side matrix. That is, > your second version is an acceptable variant of the canonical form > > matrix m = BundleOfMatrixs["test"] # extract > m |= {1,2,3,4} # modify > BundleOfMatrixs["test"] = m # re-assign > > I guess one could argue that your first formulation should be > taken as shorthand for your second, but I have to say it doesn't > "look right" to me; I would not have expected it to work -- though > I admit I'd have had difficulty predicting the error message.
I think I can justify the present behavior one step further. The thing is that the left-hand side expression BundleOfMatrixs["test"] just _happens to_ be associated with a matrix, in context; it can accept any assignment, since the type that falls under a given key can be changed. For example: <hansl> bundle B matrix m = {} B["test"] = m string s = "foo" B["test"] = s print B </hansl> This means that a left-hand side term of the form <bundlename>[<key>] is of indeterminate type, and so composite operators such as "+=" and "|=", which only work for a subset of types, cannot be used. Allin Cottrell