match ← this ##.refmatch that           ⍝ Space reference match.

Arguments [this] and [that] are references to namespaces to be compared.
[refmatch] deems the refs matching iff:

[1.0] [this] and [that] are refs to the same space, or
[2.1] The lists for all nameclasses (⎕NC) are identical, and
[2.2] Variables in both spaces match (≡∘⍎), and
[2.3] Those System variables with namespace extent in both spaces match, and
[2.4] Function and operator source (⎕CR) in both spaces match, and
[2.5] Any sub-spaces match, using the same criteria.

Note that in comparing namespaces, this function ignores:

- GUI properties, such as Posn, Size, Handle, ···
- Timestamps and User IDs in functions.
- ⎕stop, ⎕trace, ⎕monitor settings on functions.

Bugs:

1. Reference cycles are ignored and return true. See ##.scripts.refmatch.
2. References embedded in arrays are compared using only criterion [1].

Example:

    notes refmatch notes        ⍝ match on criterion [1]
1
    notes refmatch ⎕ns notes    ⍝ clone matches on criteria [2].
1
    notes refmatch {⍵⊣⍵.⎕io←0} ⎕ns notes    ⍝ disturbed clone: mismatch.
0
    'x.z' 'y.z'⎕ns¨⊂''          ⍝ create spaces.
    (x y).hello←⊂'hello'        ⍝ identical vars in x & y.
    (x y).z.world←⊂'world'      ⍝   ..      ..   in x.z & y.z.
    (x y).z.(dup←{⍵ ⍵})         ⍝   ..      fns     ..      ..

    tree¨ x y
┌───────────────┬───────────────┐
│#.x            │#.y            │
│·   ~ hello    │·   ~ hello    │
│·   z          │·   z          │
│·   ·   ~ world│·   ·   ~ world│
│·   ·   ∇ dup  │·   ·   ∇ dup  │
└───────────────┴───────────────┘

    x refmatch y    ⍝ spaces match.
1
    x.z.world←''    ⍝ zap x.z's world.

    x refmatch y    ⍝ spaces no longer match.
0

See also: le tree

Back to: contents

Back to: Workspaces