On 09/18/2015 04:38 PM, Robert Hanson wrote:
> Oh, I mistyped. I did not mean to add that colon.
>
> Use of "*" and/or "," leads to copying, but we may want to rethink how that
> works. *only that level* is copied. If there are references in there to
> deeper levels, those levels are not copied. I have to think if there is a
> straightforward way to do a deep copy. Right now it's a bit of a mixture.
>
I tried to build my own (multi-level) hash copying function with Jmol 
script but wasn't succesful, even without trying to get a deep copy.

In the long run I will need a deep copy function but currently it would 
be sufficient to copy only the single-level values (e.g.: number, 
string, boolean) of the top level as values and multi-level values 
(e.g.: hash, array) as references.
In my example below (copying the 'atomInfos' subhash of 'globalHash') 
that would mean to copy the 'seqNum' values as values and the 'SNPs' 
array as array reference.
The example hash has a few extra levels because I didn't want to get any 
surprises when I would switch to 'real world examples' that have several 
upper levels that will not be copied.

The documentation says that adding '@' in math context before the 
variable name would result in copying the value. For simple cases it 
seems to work, even without the '@':

-----------------
x = 1;
y = @x;
x = 2;
print "x=" + x + "  y=" + y;

x=2  y=1
-----------------
x = 1;
y = x;
x = 2;
print "x=" + x + "  y=" + y

x=2  y=1
-----------------
x = [a: 1, b: 2];
y = @x["a"];
x["a"] = 3;
print "x=" + x + "\ny=" + y;

x={
   "a"  :  3
   "b"  :  2
  }
y=1
-----------------
x = [a: 1, b: 2];
y = x["a"];
x["a"] = 3;
print "x=" + x + "\ny=" + y

x={
   "a"  :  3
   "b"  :  2
  }
y=1
-----------------

But within my function I couldn't get it to work:

------- Example --------------------------
function copyHashKeys(sourceHash, destinationHash, keyList) {
   if (keyList.type != "array") {
     keyList = sourceHash.keys;
   }

   if (keyList.size > 0) {
     for (var currentKey in keyList) {
       destinationHash[currentKey] = @sourceHash[currentKey];
     }
   }
}

function copyHash(sourceHash) {   # IMPORTANT: no deep copy
   var destinationHash = {};

   if (sourceHash.type == "hash") {
     copyHashKeys(sourceHash, destinationHash);
   }

   return destinationHash;
}

function renumber(atomInfos) {
   for (var atomId in atomInfos) {
     atomInfos[atomId]..seqNum *= 10;
   }
}

globalHash = [subsets: [subset1: [atomInfos: [atom1: [seqNum: 1],
                                               atom2: [seqNum: 2],
                                               atom3: [seqNum: 3, SNPs: 
["snp1","snp2"]]
                                              ]
                                  ],
                         subset2: {}
                        ]
              ];

globalHash..subsets..subset2..atomInfos = 
copyHash(globalHash..subsets..subset1..atomInfos);
renumber(globalHash..subsets..subset2..atomInfos);
print "====== Subset 2 ===========";
print globalHash..subsets..subset2..atomInfos;
print "====== Subset 1 ===========";
print globalHash..subsets..subset1..atomInfos

----- Result -----------------------------
====== Subset 2 ===========
{
   "atom1"  :
   {
     "seqNum"  :  10
    }
   "atom2"  :
   {
     "seqNum"  :  20
    }
   "atom3"  :
   {
     "SNPs"  :
     [
       snp1
       snp2
     ]
     "seqNum"  :  30
    }
  }
====== Subset 1 ===========
{
   "atom1"  :
   {
     "seqNum"  :  10
    }
   "atom2"  :
   {
     "seqNum"  :  20
    }
   "atom3"  :
   {
     "SNPs"  :
     [
       snp1
       snp2
     ]
     "seqNum"  :  30
    }
  }
------------------------------------------

I also tried other variants without success:

--- Variant 1 -------
   var value = sourceHash[currentKey];
   destinationHash[currentKey] = @value;

--- Variant 2 -------
   var value = @sourceHash[currentKey];
   destinationHash[currentKey] = value;

--- Variant 3 -------
  var value = @sourceHash[currentKey];
  destinationHash[currentKey] = @value;

--- Variant 4 -------
   destinationHash[currentKey] = sourceHash[currentKey];

--- Variant 5 -------
   var value = sourceHash[currentKey];
   destinationHash[currentKey] = value;
----------------------------------

Regards,
Rolf
-- 

Rolf Huehne
Postdoc

Leibniz Institute for Age Research - Fritz Lipmann Institute (FLI)
Beutenbergstrasse 11
07745 Jena, Germany

Phone:   +49 3641 65 6205
Fax:     +49 3641 65 6210
E-Mail:  rhue...@fli-leibniz.de
Website: http://www.fli-leibniz.de

           Scientific Director: Prof. Dr. K. Lenhard Rudolph
        Head of Administration: Dr. Daniele Barthel
Chairman of Board of Trustees: Dennys Klein

VAT No: DE 153 925 464
Register of Associations: No. 230296, Amtsgericht Jena
Tax Number: 162/141/08228


------------------------------------------------------------------------------
_______________________________________________
Jmol-users mailing list
Jmol-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jmol-users

Reply via email to