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