saved ← {seed} ##.nspack ref ⍝ Share arrays across space tree. Nspack takes a reference to a namespace to be packed by _array sharing_. Ident- ical arrays and subarrays are shared among all of the variables in the space and all of its children. In particular, if the argument is a reference to the root space (#), all variables in the workspace are shared. This may take a consider- able time but could result in a significant saving in a workspace containing complex nested arrays. The result is the number of workspace bytes saved. Nspack may be appropriate for reducing the size of a workspace, prior to deploy- ment, when file storage is at a premium. For example, when saving to a PDA. Notice that the result of ⎕size can be misleading as it ignores subarray sharing when counting the bytes consumed by a nested structure. The optional left argument is an array of values to be considered for sharing. Dyalog automatically shares literal constants from lines of code (or execute (⍎) expressions) across the whole workspace. Examples of literal constants are 9, '~∇∇' and 2 3 4 in: class←9,('~∇∇'∊incl)/2 3 4 Given that these values are already present in the workspace, nspack may as well share them with any arrays that happen to contain an identical subarray. By de- fault, "common" literals: 0, 1, ¯1, 2, ⍬, '' and ' ' are used. If reducing the size of the saved workspace is _very_ important, the following function may be used to harvest pointers to all literal values present in the workspace. Note however, that for a non-trivial workspace, it takes a depressingly long time to run (see example below). literals←{ ⍝ Unique literal values. lines←∪1 enlist(refs ⍵).(⎕NR¨↓⎕NL 3 4) ⍝ function source lines. tokns←∪1 enlist tokens¨lines ⍝ tokens within lines. ltoks←∪{((⊃¨⍵)∊'''¯',⎕D)/⍵}tokns ⍝ literal tokens. 1↓⍎¨'0',ltoks ⍝ literal values. } Technical note: Nspack includes _copies_ of functions →refs← and →pack←. This is so that it may be copied stand-alone into a subject workspace. Bugs: Nspack does not penetrate nested arrays looking for refs to (unnamed) spaces. This means that array values within such spaces are not shared. refs←⎕ns¨'' '' ⍝ array of refs containing, refs.(a←⍳3) ⍝ distinct values. nspack # ⍝ no sharing :-( 0 Examples: nested←⍳¨∘⍳¨∘⍳¨∘⍳¨⍳3 3 ⍝ complex nested array. ⎕size'nested' ⍝ size in bytes. 19484 nspack # ⍝ nspack recovers most of the space. 17996 nspack # ⍝ subsequent pack saves no more space. 0 ⎕size'nested' ⍝ size "appears" not to have changed. 19484 ⍝ The following sequences show savings in various workspaces. ⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ )xload tube ··· saved ··· compile∘⍎¨↓⎕nl 9 ⍝ compile graphs for all routes. )copy dfns nspack ··· saved ··· nspack # ⍝ takes a while but saves 86k. 88144 )erase nspack 'wsdiff'⎕se.⎕cy'dfns' ⍝ copy wsdiff to check that ⎕se.wsdiff'' ⍝ changes are transparent. ⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ )xload wdesign ··· saved ··· )copy dfns nspack ··· saved ··· nspack # ⍝ saves 130k. 133308 )erase nspack ⎕se.wsdiff'' ⍝ check changes are transparent. ⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ ⍝ The following takes an inordinate time to run, but shares every last byte. )xload wdesign ··· saved ··· literals←{ ⍝ unique literal values. lines←∪1 enlist(refs ⍵).(⎕NR¨↓⎕NL 3 4) ⍝ function lines. tokns←∪1 enlist tokens¨lines ⍝ tokens. ltoks←∪{((⊃¨⍵)∊'''¯',⎕D)/⍵}tokns ⍝ literal tokens. 1↓⍎¨'0',ltoks ⍝ literal values. } )copy dfns nspack refs enlist tokens time ··· saved ··· (literals time #)nspack # ⍝ saves extra 14k (c.f. above). 15:37.18 144488 )erase literals nspack refs enlist tokens time ⎕se.wsdiff'' ⍝ check changes are transparent. ⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ ⍝ The following example shows the difference between sharing ⍝ _within_ as opposed _among_ a number of namespaces. 'x.a' 'x.b' 'x.c'⎕ns¨⊂'' ⍝ make three spaces. x.(a b c).(var←⍳¨∘⍳¨∘⍳¨∘⍳¨⍳3 3) ⍝ populate separately. nspack¨x.(a b c) ⍝ packing _within_ spaces saves 17.5k each. 17952 17952 17952 nspack x ⍝ packing _among_ spaces saves a further 3k. 3064 See also: pack refs Data_compression Back to: contents Back to: Workspaces