{subway} ← #.compile subway ⍝ Compile graph from ⍵.source. [subway] is a reference to a namespace containing a character array: [source]. The shy result is a reference to the same namespace, which after compilation contains two additional arrays: subway.graph - nested array representing the network graph. subway.labels - corresponding names of stations and subway-stops. The source editing function [ed] undoes the effect of compilation by removing subway.(graph labels). Technical notes: This description uses →source← as an example. Try: ed notes ⍝ ... to examine the source. and trace: compile notes ⍝ ... to watch it working. The workings of the compiler can be split into four phases: lex: extracts line, station identifiers, and line restriction codes from the source; extract: represents these in terms of indices into vectors of lines, stations and platforms and the links between them. merge: consolidates the various sections network-wide. install: installs graph and label arrays into the target namespace. Extensive use is made of two auxiliary functions [zip] and [cat]. zip←{↓⍉↑⍵} ⍝ transpose nested array. cat←{↑,/⍵} ⍝ concatenate arrays. See: →zip_cat← for details. Lexical phase ------------- The lexical phase results in parallel (having the same ⍴¨) nested vectors: lines - service names such as 'Circle' or 'Metro 1'. stats - station names: 'Paddington', 'Mælkevejen', ... ctrls - one-way '↓', fork '∊' or cross '+' control characters. lines stats ctrls←zip zip¨{ ⍝ first pass: source → line sections. vecs←{↓⎕FMT↑⍵} ⍝ normalise source to vector-of-vectors. rcom←{(∧\⍵≠'/')/⍵} ⍝ remove comments '/ ···' from line. rbls←{(∨/¨' '≠⍵)/⍵} ⍝ remove blanks lines: '' '' ··· segt←{(' '≠⊃¨⍵)⊂⍵} ⍝ segment at non-blank first column. trim←{(∨\⍵≠' ')/⍵}{⌽⍺⍺⌽⍺⍺ ⍵} ⍝ remove blanks, fore and aft. tupl←'+↓∊'{⍺(trim ⍵~⍺⍺)(⍺⍺∩⍵)} ⍝ tupl: (line stat ctrl). tups←{(⊂trim⊃⍵)tupl¨1↓⍵} ⍝ tuples: tupl tupl ···. tups¨segt rbls rcom¨vecs ⍵ ⍝ line segments. }⍵.source Each but the last line defines a local function and the final line applies these to the source argument. An alternative but more obscure coding would be to replace the names in the final line, with the definitions themselves, resulting in a longish one-liner. Of particular interest: vecs←{↓⎕FMT↑⍵} ⍝ normalise source to vector-of-vectors. accepts any of: a character matrix, a nested vector of vectors, or a character vector with embedded line-feeds and returns an equivalent nested vector-of- vectors. Notice also, the functions: trim←{(∨\⍵≠' ')/⍵}{⌽⍺⍺⌽⍺⍺ ⍵} ⍝ remove blanks, fore and aft. derived from function {(∨\⍵≠' ')/⍵}, bound with operator {⌽⍺⍺⌽⍺⍺ ⍵}. Note also: tupl←'+↓∊'{⍺(trim ⍵~⍺⍺)(⍺⍺∩⍵)} ⍝ tupl: (line stat ctrl). is an [array] '+↓∊', bound with an operator {⍺(trim ⍵~⍺⍺)(⍺⍺∩⍵)}. [tupl] could have been defined as the simple function {⍺(trim ⍵~'+↓∊')('+↓∊'∩⍵)}, at the expense of duplicating the constant '+↓∊' or naming it in a separate definition. Function [tups] distributes the line label at the head (⊃⍵) of each section, to each station in the remainer (1↓⍵). tups←{(⊂trim⊃⍵)tupl¨1↓⍵} ⍝ tuples: tupl tupl ···. An alternative, ⎕ML-independent, coding of (⊂trim⊃⍵), would be (trim¨1↑⍵). Compiling →source←, we get: disp lines ┌→──────────────────┬─────────────────────────┬───────────────────────────────────────────┐ │┌→────┬─────┬─────┐│┌→────┬─────┬─────┬─────┐│┌→─────┬──────┬──────┬──────┬──────┬──────┐│ ││Fruit│Fruit│Fruit│││Fruit│Fruit│Fruit│Fruit│││Veggie│Veggie│Veggie│Veggie│Veggie│Veggie││ │└────→┴────→┴────→┘│└────→┴────→┴────→┴────→┘│└─────→┴─────→┴─────→┴─────→┴─────→┴─────→┘│ └──────────────────→┴────────────────────────→┴──────────────────────────────────────────→┘ disp stats ┌→────────────────────┬─────────────────────────┬────────────────────────────────────────────┐ │┌→────┬──────┬──────┐│┌→────┬──────┬────┬─────┐│┌→──────┬─────┬──────┬───────┬─────┬───────┐│ ││Apple│Tomato│Banana│││Grape│Tomato│Pear│Grape│││Spinach│Onion│Tomato│Lettuce│Onion│Cabbage││ │└────→┴─────→┴─────→┘│└────→┴─────→┴───→┴────→┘│└──────→┴────→┴─────→┴──────→┴────→┴──────→┘│ └────────────────────→┴────────────────────────→┴───────────────────────────────────────────→┘ disp ctrls ┌→──────┬──────────┬─────────────┐ │┌→┬─┬─┐│┌→┬──┬─┬─┐│┌→┬─┬─┬─┬─┬─┐│ ││ │∊│ │││↓│↓∊│↓│ │││ │+│ │ │+│ ││ │└⊖┴→┴⊖┘│└→┴─→┴→┴⊖┘│└⊖┴→┴⊖┴⊖┴→┴⊖┘│ └──────→┴─────────→┴────────────→┘ Extraction phase ---------------- This phase generates various working arrays. A particular feature, the "cross", is processed at this stage. Crosses occur where different sections of the same line criss-cross a station in different directions. An example is London Under- ground's station at Poplar on the Docklands Light Railway (DLR). The coss stop is augmented with extra stops for each line direction. For example, the stop at Poplar (DLR Poplar) is replaced with "virtual" stops (DLR Poplar_N-S) and (DLR Poplar_E-W). We do this by marking each stop with an additional label, which is 0 for non-crossing stops and a unique sequence number [csids] for crossing stat- ions. In this way, the stops remain disctinct in the unique stops vector (see below). seqs←{(⍳¨⍵)+0,+\¯1↓⍵} ⍝ sequences of sequences. csids←{⍵\¨seqs+/¨⍵}'+'∊¨¨ctrls ⍝ stations marked as cross-tracks. disp ctrls ┌→──────┬──────────┬─────────────┐ │┌→┬─┬─┐│┌→┬──┬─┬─┐│┌→┬─┬─┬─┬─┬─┐│ ││ │∊│ │││↓│↓∊│↓│ │││ │+│ │ │+│ ││ │└⊖┴→┴⊖┘│└→┴─→┴→┴⊖┘│└⊖┴→┴⊖┴⊖┴→┴⊖┘│ └──────→┴─────────→┴────────────→┘ disp csids ┌→────┬───────┬───────────┐ │0 0 0│0 0 0 0│0 1 0 0 2 0│ └~───→┴~─────→┴~─────────→┘ Next, define [stops], a vector of stops per line section. stops←zip¨zip lines stats csids ⍝ subway stops. Notice the distinct cross stops: (Veggie Onion 1), (Veggie Onion 2): disp stops ┌→──────────────────────────────────────────────────┬─────────────────────────────────────────────────────────────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │┌→──────────────┬────────────────┬────────────────┐│┌→──────────────┬────────────────┬──────────────┬───────────────┐│┌→─────────────────┬────────────────┬─────────────────┬──────────────────┬────────────────┬──────────────────┐│ ││┌→────┬─────┬─┐│┌→────┬──────┬─┐│┌→────┬──────┬─┐│││┌→────┬─────┬─┐│┌→────┬──────┬─┐│┌→────┬────┬─┐│┌→────┬─────┬─┐│││┌→─────┬───────┬─┐│┌→─────┬─────┬─┐│┌→─────┬──────┬─┐│┌→─────┬───────┬─┐│┌→─────┬─────┬─┐│┌→─────┬───────┬─┐││ │││Fruit│Apple│0│││Fruit│Tomato│0│││Fruit│Banana│0│││││Fruit│Grape│0│││Fruit│Tomato│0│││Fruit│Pear│0│││Fruit│Grape│0│││││Veggie│Spinach│0│││Veggie│Onion│1│││Veggie│Tomato│0│││Veggie│Lettuce│0│││Veggie│Onion│2│││Veggie│Cabbage│0│││ ││└────→┴────→┴─┘│└────→┴─────→┴─┘│└────→┴─────→┴─┘│││└────→┴────→┴─┘│└────→┴─────→┴─┘│└────→┴───→┴─┘│└────→┴────→┴─┘│││└─────→┴──────→┴─┘│└─────→┴────→┴─┘│└─────→┴─────→┴─┘│└─────→┴──────→┴─┘│└─────→┴────→┴─┘│└─────→┴──────→┴─┘││ │└──────────────→┴───────────────→┴───────────────→┘│└──────────────→┴───────────────→┴─────────────→┴──────────────→┘│└─────────────────→┴───────────────→┴────────────────→┴─────────────────→┴───────────────→┴─────────────────→┘│ └──────────────────────────────────────────────────→┴────────────────────────────────────────────────────────────────→┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────→┘ Most stops have a platform for each direction, the "up-line" '^', and the "down- line" '∨'. The platform vectors come from the outer product: ···∘.,'^∨'. One-way sections are processed later. plats←{↓⍵∘.,'^∨'}¨stops ⍝ platform for each direction. disp plats ┌→──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │┌→────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┐│┌→────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────┬─────────────────────────────────────┐│┌→──────────────────────────────────────────┬───────────────────────────────────────┬─────────────────────────────────────────┬───────────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────────┐│ ││┌→────────────────┬─────────────────┐│┌→─────────────────┬──────────────────┐│┌→─────────────────┬──────────────────┐│││┌→────────────────┬─────────────────┐│┌→─────────────────┬──────────────────┐│┌→───────────────┬────────────────┐│┌→────────────────┬─────────────────┐│││┌→───────────────────┬────────────────────┐│┌→─────────────────┬──────────────────┐│┌→──────────────────┬───────────────────┐│┌→───────────────────┬────────────────────┐│┌→─────────────────┬──────────────────┐│┌→───────────────────┬────────────────────┐││ │││┌→────┬─────┬─┬─┐│┌→────┬─────┬─┬─┐│││┌→────┬──────┬─┬─┐│┌→────┬──────┬─┬─┐│││┌→────┬──────┬─┬─┐│┌→────┬──────┬─┬─┐│││││┌→────┬─────┬─┬─┐│┌→────┬─────┬─┬─┐│││┌→────┬──────┬─┬─┐│┌→────┬──────┬─┬─┐│││┌→────┬────┬─┬─┐│┌→────┬────┬─┬─┐│││┌→────┬─────┬─┬─┐│┌→────┬─────┬─┬─┐│││││┌→─────┬───────┬─┬─┐│┌→─────┬───────┬─┬─┐│││┌→─────┬─────┬─┬─┐│┌→─────┬─────┬─┬─┐│││┌→─────┬──────┬─┬─┐│┌→─────┬──────┬─┬─┐│││┌→─────┬───────┬─┬─┐│┌→─────┬───────┬─┬─┐│││┌→─────┬─────┬─┬─┐│┌→─────┬─────┬─┬─┐│││┌→─────┬───────┬─┬─┐│┌→─────┬───────┬─┬─┐│││ ││││Fruit│Apple│0│^│││Fruit│Apple│0│∨│││││Fruit│Tomato│0│^│││Fruit│Tomato│0│∨│││││Fruit│Banana│0│^│││Fruit│Banana│0│∨│││││││Fruit│Grape│0│^│││Fruit│Grape│0│∨│││││Fruit│Tomato│0│^│││Fruit│Tomato│0│∨│││││Fruit│Pear│0│^│││Fruit│Pear│0│∨│││││Fruit│Grape│0│^│││Fruit│Grape│0│∨│││││││Veggie│Spinach│0│^│││Veggie│Spinach│0│∨│││││Veggie│Onion│1│^│││Veggie│Onion│1│∨│││││Veggie│Tomato│0│^│││Veggie│Tomato│0│∨│││││Veggie│Lettuce│0│^│││Veggie│Lettuce│0│∨│││││Veggie│Onion│2│^│││Veggie│Onion│2│∨│││││Veggie│Cabbage│0│^│││Veggie│Cabbage│0│∨││││ │││└────→┴────→┴─┴─┘│└────→┴────→┴─┴─┘│││└────→┴─────→┴─┴─┘│└────→┴─────→┴─┴─┘│││└────→┴─────→┴─┴─┘│└────→┴─────→┴─┴─┘│││││└────→┴────→┴─┴─┘│└────→┴────→┴─┴─┘│││└────→┴─────→┴─┴─┘│└────→┴─────→┴─┴─┘│││└────→┴───→┴─┴─┘│└────→┴───→┴─┴─┘│││└────→┴────→┴─┴─┘│└────→┴────→┴─┴─┘│││││└─────→┴──────→┴─┴─┘│└─────→┴──────→┴─┴─┘│││└─────→┴────→┴─┴─┘│└─────→┴────→┴─┴─┘│││└─────→┴─────→┴─┴─┘│└─────→┴─────→┴─┴─┘│││└─────→┴──────→┴─┴─┘│└─────→┴──────→┴─┴─┘│││└─────→┴────→┴─┴─┘│└─────→┴────→┴─┴─┘│││└─────→┴──────→┴─┴─┘│└─────→┴──────→┴─┴─┘│││ ││└────────────────→┴────────────────→┘│└─────────────────→┴─────────────────→┘│└─────────────────→┴─────────────────→┘│││└────────────────→┴────────────────→┘│└─────────────────→┴─────────────────→┘│└───────────────→┴───────────────→┘│└────────────────→┴────────────────→┘│││└───────────────────→┴───────────────────→┘│└─────────────────→┴─────────────────→┘│└──────────────────→┴──────────────────→┘│└───────────────────→┴───────────────────→┘│└─────────────────→┴─────────────────→┘│└───────────────────→┴───────────────────→┘││ │└────────────────────────────────────→┴──────────────────────────────────────→┴──────────────────────────────────────→┘│└────────────────────────────────────→┴──────────────────────────────────────→┴──────────────────────────────────→┴────────────────────────────────────→┘│└──────────────────────────────────────────→┴──────────────────────────────────────→┴────────────────────────────────────────→┴──────────────────────────────────────────→┴──────────────────────────────────────→┴──────────────────────────────────────────→┘│ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────→┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────→┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────→┘ We now have enough information to label all vertices (stations and platforms) of the final graph. verts←∪cat cat¨stats(cat plats) ⍝ graph vertices. disp verts ┌→────┬──────┬──────┬─────┬────┬───────┬─────┬───────┬───────┬─────────────────┬─────────────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┬─────────────────┬─────────────────┬────────────────┬────────────────┬────────────────────┬────────────────────┬──────────────────┬──────────────────┬───────────────────┬───────────────────┬────────────────────┬────────────────────┬──────────────────┬──────────────────┬────────────────────┬────────────────────┐ │ │ │ │ │ │ │ │ │ │┌→────┬─────┬─┬─┐│┌→────┬─────┬─┬─┐│┌→────┬──────┬─┬─┐│┌→────┬──────┬─┬─┐│┌→────┬──────┬─┬─┐│┌→────┬──────┬─┬─┐│┌→────┬─────┬─┬─┐│┌→────┬─────┬─┬─┐│┌→────┬────┬─┬─┐│┌→────┬────┬─┬─┐│┌→─────┬───────┬─┬─┐│┌→─────┬───────┬─┬─┐│┌→─────┬─────┬─┬─┐│┌→─────┬─────┬─┬─┐│┌→─────┬──────┬─┬─┐│┌→─────┬──────┬─┬─┐│┌→─────┬───────┬─┬─┐│┌→─────┬───────┬─┬─┐│┌→─────┬─────┬─┬─┐│┌→─────┬─────┬─┬─┐│┌→─────┬───────┬─┬─┐│┌→─────┬───────┬─┬─┐│ │Apple│Tomato│Banana│Grape│Pear│Spinach│Onion│Lettuce│Cabbage││Fruit│Apple│0│^│││Fruit│Apple│0│∨│││Fruit│Tomato│0│^│││Fruit│Tomato│0│∨│││Fruit│Banana│0│^│││Fruit│Banana│0│∨│││Fruit│Grape│0│^│││Fruit│Grape│0│∨│││Fruit│Pear│0│^│││Fruit│Pear│0│∨│││Veggie│Spinach│0│^│││Veggie│Spinach│0│∨│││Veggie│Onion│1│^│││Veggie│Onion│1│∨│││Veggie│Tomato│0│^│││Veggie│Tomato│0│∨│││Veggie│Lettuce│0│^│││Veggie│Lettuce│0│∨│││Veggie│Onion│2│^│││Veggie│Onion│2│∨│││Veggie│Cabbage│0│^│││Veggie│Cabbage│0│∨││ │ │ │ │ │ │ │ │ │ │└────→┴────→┴─┴─┘│└────→┴────→┴─┴─┘│└────→┴─────→┴─┴─┘│└────→┴─────→┴─┴─┘│└────→┴─────→┴─┴─┘│└────→┴─────→┴─┴─┘│└────→┴────→┴─┴─┘│└────→┴────→┴─┴─┘│└────→┴───→┴─┴─┘│└────→┴───→┴─┴─┘│└─────→┴──────→┴─┴─┘│└─────→┴──────→┴─┴─┘│└─────→┴────→┴─┴─┘│└─────→┴────→┴─┴─┘│└─────→┴─────→┴─┴─┘│└─────→┴─────→┴─┴─┘│└─────→┴──────→┴─┴─┘│└─────→┴──────→┴─┴─┘│└─────→┴────→┴─┴─┘│└─────→┴────→┴─┴─┘│└─────→┴──────→┴─┴─┘│└─────→┴──────→┴─┴─┘│ └────→┴─────→┴─────→┴────→┴───→┴──────→┴────→┴──────→┴──────→┴────────────────→┴────────────────→┴─────────────────→┴─────────────────→┴─────────────────→┴─────────────────→┴────────────────→┴────────────────→┴───────────────→┴───────────────→┴───────────────────→┴───────────────────→┴─────────────────→┴─────────────────→┴──────────────────→┴──────────────────→┴───────────────────→┴───────────────────→┴─────────────────→┴─────────────────→┴───────────────────→┴───────────────────→┘ Before the merging phase, we need vectors of graph-platform indices and pairs of graph-station indices: platx←{↓verts⍳↑⍵}¨plats ⍝ platform indices within graph. statx←{2/¨verts⍳⍵}¨stats ⍝ station indices within graph. disp platx ┌→──────────────────┬─────────────────────────┬─────────────────────────────────────┐ │┌→────┬─────┬─────┐│┌→────┬─────┬─────┬─────┐│┌→────┬─────┬─────┬─────┬─────┬─────┐│ ││10 11│12 13│14 15│││16 17│12 13│18 19│16 17│││20 21│22 23│24 25│26 27│28 29│30 31││ │└~───→┴~───→┴~───→┘│└~───→┴~───→┴~───→┴~───→┘│└~───→┴~───→┴~───→┴~───→┴~───→┴~───→┘│ └──────────────────→┴────────────────────────→┴────────────────────────────────────→┘ disp statx ┌→────────────┬─────────────────┬─────────────────────────┐ │┌→──┬───┬───┐│┌→──┬───┬───┬───┐│┌→──┬───┬───┬───┬───┬───┐│ ││1 1│2 2│3 3│││4 4│2 2│5 5│4 4│││6 6│7 7│2 2│8 8│7 7│9 9││ │└~─→┴~─→┴~─→┘│└~─→┴~─→┴~─→┴~─→┘│└~─→┴~─→┴~─→┴~─→┴~─→┴~─→┘│ └────────────→┴────────────────→┴────────────────────────→┘ It is convenient at this stage to extract a vector of unique line indices, which will be used later to collect the sections of each line. (Sections of track for a particular line are not necessarily adjacent in the source code). linex←{(∪⍵)⍳⍵}⊃¨lines ⍝ line indices per segment. disp linex 1 1 2 Having accommodated cross-track restrictions, the merging phase is now interest- ed only in one-way sections and forks, so an array of 2-bools is extracted: rests←'↓∊'∘∊¨¨ctrls ⍝ restrictions: 1-way sects and forks. disp rests ┌→────────────┬─────────────────┬─────────────────────────┐ │┌→──┬───┬───┐│┌→──┬───┬───┬───┐│┌→──┬───┬───┬───┬───┬───┐│ ││0 0│0 1│0 0│││1 0│1 1│1 0│0 0│││0 0│0 0│0 0│0 0│0 0│0 0││ │└~─→┴~─→┴~─→┘│└~─→┴~─→┴~─→┴~─→┘│└~─→┴~─→┴~─→┴~─→┴~─→┴~─→┘│ └────────────→┴────────────────→┴────────────────────────→┘ Merging phase ------------- For each section of track, the stops are examined pair-wise, and links between adjacent stops established. The links take account of one-way sections and forks. plinks←cat¨2{ ⍝ platform-to-platform links / section. ··· }/¨zip¨zip platx rests ⍝ pairwise for each line section. The expression (zip¨zip platx rests) produces a vector per line section of pairs of platform indices and track restrictions. For the middle section (for example) of the sample →source←: Source Platx Map ------ ----- --- ↓ Grape 16 - 17 T ∊↓ Tomato 12 - 13 ┌─┴─┐ ↓ Pear 18 - 19 ↑ ↓ Grape 16 - 17 │ │ G─←─P this looks like: disp 2⊃zip¨zip platx rests ⍝ (middle section) ┌→──────────┬───────────┬───────────┬───────────┐ │┌→────┬───┐│┌→────┬───┐│┌→────┬───┐│┌→────┬───┐│ ││16 17│1 0│││12 13│1 1│││18 19│1 0│││16 17│0 0││ │└~───→┴~─→┘│└~───→┴~─→┘│└~───→┴~─→┘│└~───→┴~─→┘│ └──────────→┴──────────→┴──────────→┴──────────→┘ Platforms 16 and 17 at the first stop are at the entrance to a one-way section as are platforms 12 and 13 in addition to being on the handle of a fork. Items of the vector are processed two at a time, delivered as left and right arguments to the the operand function: links((ow fk)_)←zip ⍺ ⍵ ⍝ directions and restrictions. rev←{⌽⍵}\ ⍝ reverse second pair. oway←{⍺:1↑⍵ ⋄ rev ⍵} ⍝ one-way section. fork←{⍺:⌽zip rev ⍵ ⋄ zip ⍵} ⍝ fork. ow oway fk fork links ⍝ ⍺←→⍵ links. For the first call, the values of the arguments are: disp ⍺ ⍵ ┌→──────────┬───────────┐ │┌→────┬───┐│┌→────┬───┐│ ││16 17│1 0│││12 13│1 1││ │└~───→┴~─→┘│└~───→┴~─→┘│ └──────────→┴──────────→┘ Notice the use of "structure assignment" to name parts of the link structure. As restrictions on only the entry side of the link are relevant, those on the exit side are ignored by being assigned a "sink" name '_'. links((ow fk)_)←zip ⍺ ⍵ ⍝ directions and restrictions. disp links ┌→────┬─────┐ │16 17│12 13│ └~───→┴~───→┘ disp ow fk ⍝ one-way and fork markers. 1 0 Auxiliary function: rev←{⌽⍵}\ ⍝ reverse second pair. reverses the second link in a pair, to model up-line, down-line directions. In this example, platforms 16→12, and 13→17, are linked. disp rev zip links ┌→────┬─────┐ │16 12│13 17│ └~───→┴~───→┘ Auxiliary functions: [oway] and [fork] apply corresponding line restrictions: oway←{⍺:1↑⍵ ⋄ rev ⍵} ⍝ one-way section. fork←{⍺:⌽zip rev ⍵ ⋄ zip ⍵} ⍝ fork. so that expression: ow oway fk fork links ⍝ ⍺←→⍵ links. returns a vector of one or two links, in this case the single link 16→12: disp ow oway fk fork links ┌→────┐ │16 12│ └~───→┘ The resulting vector [plinks] is a set of platform-to-platform links for the whole network. disp plinks ┌→────────────────────────┬───────────────────┬─────────────────────────────────────────────────────────────┐ │┌→────┬─────┬─────┬─────┐│┌→────┬─────┬─────┐│┌→────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐│ ││10 12│13 11│13 14│15 12│││16 12│13 18│18 16│││20 22│23 21│22 24│25 23│24 26│27 25│26 28│29 27│28 30│31 29││ │└~───→┴~───→┴~───→┴~───→┘│└~───→┴~───→┴~───→┘│└~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┘│ └────────────────────────→┴──────────────────→┴────────────────────────────────────────────────────────────→┘ Next, using the line section index vector from above, line sections are grouped by line prior to being consolidated. clinks←((∪linex)=⊂linex)/¨⊂plinks ⍝ link sections collected by line. disp clinks ┌→──────────────────────────────────────────────┬───────────────────────────────────────────────────────────────┐ │┌→────────────────────────┬───────────────────┐│┌→────────────────────────────────────────────────────────────┐│ ││┌→────┬─────┬─────┬─────┐│┌→────┬─────┬─────┐│││┌→────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐││ │││10 12│13 11│13 14│15 12│││16 12│13 18│18 16│││││20 22│23 21│22 24│25 23│24 26│27 25│26 28│29 27│28 30│31 29│││ ││└~───→┴~───→┴~───→┴~───→┘│└~───→┴~───→┴~───→┘│││└~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┘││ │└────────────────────────→┴──────────────────→┘│└────────────────────────────────────────────────────────────→┘│ └──────────────────────────────────────────────→┴──────────────────────────────────────────────────────────────→┘ The final sub-phase is to connect all sections for the same line. This is achieved by applying a "connecting" reduction along the vector of sub-sections for each line, after which we can concatenate all line sections, network-wide. llinks←cat↑{ ⍝ connected sections for all lines. ··· ⍝ (connect adjacent link vectors). }/¨clinks ⍝ for each section of each line. However, connecting sections by just concatenating the vectors will not work, as this might result in the up-line of one sub-section's being connected to the down-line of its neighbour. ···───→───∘───→───∘─→ ? ←─∘───←───∘───←───··· │ │ │ │ Line A: ⎕ ⎕ ⎕ ⎕ Line A: │ │ │ │ ···───←───∘───←───∘─← ? →─∘───→───∘───→───··· In this case, we must twist the direction of links at the join. ···───→───∘───┐ ┌─∘─←───←─∘───←───∘───←───··· │ ↓ ↓ │ │ │ Line A: ⎕ ┌─│─┘ ⎕ ⎕ ⎕ Line A: │ ↓ ↓ │ │ │ ···───←───∘─┘ └─→─∘─→───→─∘───→───∘───→───··· For the first line of →source←, the two sub-sections are: disp ⊃clinks ┌→────────────────────────┬───────────────────┐ │┌→────┬─────┬─────┬─────┐│┌→────┬─────┬─────┐│ ││10 12│13 11│13 14│15 12│││16 12│13 18│18 16││ │└~───→┴~───→┴~───→┴~───→┘│└~───→┴~───→┴~───→┘│ └────────────────────────→┴──────────────────→┘ Notice that there are links: 10→12, 15→12 and 16→12, but no link [from] 12. In this case there is a clash: llinks←cat↑{ ⍝ connected sections for all lines. next←⍺~⍵ ⍝ next section, duplicates removed. disp¨next ⍵ ┌→────┬─────┬─────┬─────┐ ┌→────┬─────┬─────┐ │10 12│13 11│13 14│15 12│ │16 12│13 18│18 16│ └~───→┴~───→┴~───→┴~───→┘ └~───→┴~───→┴~───→┘ clash←↑∪zip∩⌿↑zip¨next ⍵ ⍝ incompatible directions. disp clash 13 12 We can avoid the clash if we exchange all occurrences of 13 and 12 in the first set of links. To take a slightly larger example, when connecting London's Picadilly line (as coded here), there are two clashes: disp next ┌→──────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┐ │444 446│447 445│446 448│449 447│448 450│451 449│450 452│453 451│452 454│455 453│454 456│457 455│456 458│459 457│458 460│461 459│460 462│463 461│462 464│465 463│464 466│467 465│466 468│469 467│468 470│471 469│470 472│473 471│473 474│475 472│474 476│477 475│476 478│479 477│478 480│481 479│480 482│483 481│482 484│485 483│484 486│487 485│486 488│489 487│ └~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┘ disp ⍵ ┌→──────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┐ │490 488│489 492│492 490│494 496│497 495│496 498│499 497│498 500│501 499│500 502│503 501│502 504│505 503│504 506│507 505│506 508│509 507│508 510│511 509│510 512│513 511│512 514│515 513│514 516│517 515│516 518│519 517│518 520│521 519│520 522│523 521│522 524│525 523│524 526│527 525│526 528│529 527│528 530│531 529│530 532│533 531│532 534│535 533│534 536│537 535│536 538│539 537│538 540│541 539│540 542│543 541│542 544│545 543│544 546│547 545│546 472│473 547│ └~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┘ disp clash 473 472 489 488 disp verts[clash] ┌→────────────────────────────┬─────────────────────────────┐ ↓ ┌→─────────┬──────────┬─┬─┐ │ ┌→─────────┬──────────┬─┬─┐ │ │ │Piccadilly│Acton Town│0│∨│ │ │Piccadilly│Acton Town│0│^│ │ │ └─────────→┴─────────→┴─┴─┘ │ └─────────→┴─────────→┴─┴─┘ │ ├────────────────────────────→┼────────────────────────────→┤ │┌→─────────┬────────────┬─┬─┐│┌→─────────┬────────────┬─┬─┐│ ││Piccadilly│Hatton Cross│0│∨│││Piccadilly│Hatton Cross│0│^││ │└─────────→┴───────────→┴─┴─┘│└─────────→┴───────────→┴─┴─┘│ └────────────────────────────→┴────────────────────────────→┘ We must exchange all occurrences of 472←→473 and 488←→489. To do this, we make a difference matrix of the values to [add] to each index. diffs←⍉¯1 1∘.×-/clash ⍝ vertex index differences. disp diffs ¯1 1 ¯1 1 [avecs] is then, a vector of adjustments to add to the [next] section indices: avecs←↑+/,diffs×clash=⊂next ⍝ adjustment vectors. disp avecs ┌→──┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬────┬────┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬────┐ │0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 1│¯1 0│¯1 0│0 1│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 1│¯1 0│ └~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~──→┴~──→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~──→┘ and finally, the adjusted indices vector is joined to the right argument accum- ulated link vector for the line. (next+avecs),⍵ ⍝ connected line subsections. As the outer function reduction proceeds, all sub-sections for each line are aligned and on exit from the reduction, sections for all lines are consolidated. llinks←cat↑{ ⍝ connected sections for all lines. For the →source← example, this results in: disp llinks ┌→────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │10 13│12 11│12 14│15 13│16 12│13 18│18 16│20 22│23 21│22 24│25 23│24 26│27 25│26 28│29 27│28 30│31 29│ └~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┘ Installation phase ------------------ In this phase, the final [graph] and [labels] vectors are installed in the target namespace. [slinks] is a set of links (stat plat) (stat plat) ···, from each station to each of its platforms. slinks←cat zip¨zip cat¨statx platx ⍝ (stat plat) ··· links. disp slinks ┌→───┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐ │1 10│1 11│2 12│2 13│3 14│3 15│4 16│4 17│2 12│2 13│5 18│5 19│4 16│4 17│6 20│6 21│7 22│7 23│2 24│2 25│8 26│8 27│7 28│7 29│9 30│9 31│ └~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┘ [elinks] is a matrix with one row for links in each direction: elinks←,0 1∘.⌽slinks ⍝ station-platform each-way links. disp elinks ┌→───┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐ ↓1 10│1 11│2 12│2 13│3 14│3 15│4 16│4 17│2 12│2 13│5 18│5 19│4 16│4 17│6 20│6 21│7 22│7 23│2 24│2 25│8 26│8 27│7 28│7 29│9 30│9 31│ ├~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┤ │10 1│11 1│12 2│13 2│14 3│15 3│16 4│17 4│12 2│13 2│18 5│19 5│16 4│17 4│20 6│21 6│22 7│23 7│24 2│25 2│26 8│27 8│28 7│29 7│30 9│31 9│ └~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┘ [nlinks] is the sorted set of unique links for the whole subway network. nlinks←{⍵[⍋↑⍵]}∪(,elinks),llinks ⍝ combined network-wide links. disp nlinks ┌→───┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────┬────┬────┬─────┬─────┬────┬─────┬────┬────┬─────┬────┬─────┬────┬────┬─────┬────┬────┬─────┬────┬────┬─────┬────┬─────┬────┬─────┬────┬─────┬────┬─────┬────┬─────┬────┬─────┬────┬─────┬────┬────┬─────┐ │1 10│1 11│2 12│2 13│2 24│2 25│3 14│3 15│4 16│4 17│5 18│5 19│6 20│6 21│7 22│7 23│7 28│7 29│8 26│8 27│9 30│9 31│10 1│10 13│11 1│12 2│12 11│12 14│13 2│13 18│14 3│15 3│15 13│16 4│16 12│17 4│18 5│18 16│19 5│20 6│20 22│21 6│22 7│22 24│23 7│23 21│24 2│24 26│25 2│25 23│26 8│26 28│27 8│27 25│28 7│28 30│29 7│29 27│30 9│31 9│31 29│ └~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~───→┴~──→┴~──→┴~───→┴~───→┴~──→┴~───→┴~──→┴~──→┴~───→┴~──→┴~───→┴~──→┴~──→┴~───→┴~──→┴~──→┴~───→┴~──→┴~──→┴~───→┴~──→┴~───→┴~──→┴~───→┴~──→┴~───→┴~──→┴~───→┴~──→┴~───→┴~──→┴~───→┴~──→┴~───→┴~──→┴~──→┴~───→┘ Finally, [⍵.graph] is installed: ⍵.graph←↑{(⍺≠¯1⌽⍺)⊂⍵}/zip nlinks ⍝ network graph. The first item of each pair in [nlinks] determines the position within [graph] of the placement of the second item. So graph[1]←10, graph[1],←11, graph[2]←12, and so on. disp ⍵.graph ┌→────┬───────────┬─────┬─────┬─────┬─────┬───────────┬─────┬─────┬────┬─┬───────┬────┬─┬────┬────┬─┬────┬─┬────┬─┬────┬────┬────┬────┬────┬────┬────┬────┬─┬────┐ │10 11│12 13 24 25│14 15│16 17│18 19│20 21│22 23 28 29│26 27│30 31│1 13│1│2 11 14│2 18│3│3 13│4 12│4│5 16│5│6 22│6│7 24│7 21│2 26│2 23│8 28│8 25│7 30│7 27│9│9 29│ └~───→┴~─────────→┴~───→┴~───→┴~───→┴~───→┴~─────────→┴~───→┴~───→┴~──→┴→┴~─────→┴~──→┴→┴~──→┴~──→┴→┴~──→┴→┴~──→┴→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴→┴~──→┘ The labels (or tags) vector for each vertex is now produced. Firstly, a set of labels for each stop: stags←2/⌽¨2↑¨∪cat stops ⍝ (stop line) label pairs. disp stags ┌→────────────┬─────────────┬──────────────┬──────────────┬──────────────┬──────────────┬─────────────┬─────────────┬────────────┬────────────┬────────────────┬────────────────┬──────────────┬──────────────┬───────────────┬───────────────┬────────────────┬────────────────┬──────────────┬──────────────┬────────────────┬────────────────┐ │┌→────┬─────┐│┌→────┬─────┐│┌→─────┬─────┐│┌→─────┬─────┐│┌→─────┬─────┐│┌→─────┬─────┐│┌→────┬─────┐│┌→────┬─────┐│┌→───┬─────┐│┌→───┬─────┐│┌→──────┬──────┐│┌→──────┬──────┐│┌→────┬──────┐│┌→────┬──────┐│┌→─────┬──────┐│┌→─────┬──────┐│┌→──────┬──────┐│┌→──────┬──────┐│┌→────┬──────┐│┌→────┬──────┐│┌→──────┬──────┐│┌→──────┬──────┐│ ││Apple│Fruit│││Apple│Fruit│││Tomato│Fruit│││Tomato│Fruit│││Banana│Fruit│││Banana│Fruit│││Grape│Fruit│││Grape│Fruit│││Pear│Fruit│││Pear│Fruit│││Spinach│Veggie│││Spinach│Veggie│││Onion│Veggie│││Onion│Veggie│││Tomato│Veggie│││Tomato│Veggie│││Lettuce│Veggie│││Lettuce│Veggie│││Onion│Veggie│││Onion│Veggie│││Cabbage│Veggie│││Cabbage│Veggie││ │└────→┴────→┘│└────→┴────→┘│└─────→┴────→┘│└─────→┴────→┘│└─────→┴────→┘│└─────→┴────→┘│└────→┴────→┘│└────→┴────→┘│└───→┴────→┘│└───→┴────→┘│└──────→┴─────→┘│└──────→┴─────→┘│└────→┴─────→┘│└────→┴─────→┘│└─────→┴─────→┘│└─────→┴─────→┘│└──────→┴─────→┘│└──────→┴─────→┘│└────→┴─────→┘│└────→┴─────→┘│└──────→┴─────→┘│└──────→┴─────→┘│ └────────────→┴────────────→┴─────────────→┴─────────────→┴─────────────→┴─────────────→┴────────────→┴────────────→┴───────────→┴───────────→┴───────────────→┴───────────────→┴─────────────→┴─────────────→┴──────────────→┴──────────────→┴───────────────→┴───────────────→┴─────────────→┴─────────────→┴───────────────→┴───────────────→┘ Each label is merged with indentation ' ' and separation ' ' vectors. Incorp- orating the blanks at this stage, simpilfies the merging code in the [trip] function, later. slabs←cat¨zip¨zip(⊂4 1↑¨⊂'')stags ⍝ indented stop labels. disp slabs ┌→───────────────────┬────────────────────┬─────────────────────┬─────────────────────┬─────────────────────┬─────────────────────┬────────────────────┬────────────────────┬───────────────────┬───────────────────┬───────────────────────┬───────────────────────┬─────────────────────┬─────────────────────┬──────────────────────┬──────────────────────┬───────────────────────┬───────────────────────┬─────────────────────┬─────────────────────┬───────────────────────┬───────────────────────┐ │┌→───┬─────┬─┬─────┐│┌→───┬─────┬─┬─────┐│┌→───┬──────┬─┬─────┐│┌→───┬──────┬─┬─────┐│┌→───┬──────┬─┬─────┐│┌→───┬──────┬─┬─────┐│┌→───┬─────┬─┬─────┐│┌→───┬─────┬─┬─────┐│┌→───┬────┬─┬─────┐│┌→───┬────┬─┬─────┐│┌→───┬───────┬─┬──────┐│┌→───┬───────┬─┬──────┐│┌→───┬─────┬─┬──────┐│┌→───┬─────┬─┬──────┐│┌→───┬──────┬─┬──────┐│┌→───┬──────┬─┬──────┐│┌→───┬───────┬─┬──────┐│┌→───┬───────┬─┬──────┐│┌→───┬─────┬─┬──────┐│┌→───┬─────┬─┬──────┐│┌→───┬───────┬─┬──────┐│┌→───┬───────┬─┬──────┐│ ││ │Apple│ │Fruit│││ │Apple│ │Fruit│││ │Tomato│ │Fruit│││ │Tomato│ │Fruit│││ │Banana│ │Fruit│││ │Banana│ │Fruit│││ │Grape│ │Fruit│││ │Grape│ │Fruit│││ │Pear│ │Fruit│││ │Pear│ │Fruit│││ │Spinach│ │Veggie│││ │Spinach│ │Veggie│││ │Onion│ │Veggie│││ │Onion│ │Veggie│││ │Tomato│ │Veggie│││ │Tomato│ │Veggie│││ │Lettuce│ │Veggie│││ │Lettuce│ │Veggie│││ │Onion│ │Veggie│││ │Onion│ │Veggie│││ │Cabbage│ │Veggie│││ │Cabbage│ │Veggie││ │└───→┴────→┴→┴────→┘│└───→┴────→┴→┴────→┘│└───→┴─────→┴→┴────→┘│└───→┴─────→┴→┴────→┘│└───→┴─────→┴→┴────→┘│└───→┴─────→┴→┴────→┘│└───→┴────→┴→┴────→┘│└───→┴────→┴→┴────→┘│└───→┴───→┴→┴────→┘│└───→┴───→┴→┴────→┘│└───→┴──────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│└───→┴────→┴→┴─────→┘│└───→┴────→┴→┴─────→┘│└───→┴─────→┴→┴─────→┘│└───→┴─────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│└───→┴────→┴→┴─────→┘│└───→┴────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│ └───────────────────→┴───────────────────→┴────────────────────→┴────────────────────→┴────────────────────→┴────────────────────→┴───────────────────→┴───────────────────→┴──────────────────→┴──────────────────→┴──────────────────────→┴──────────────────────→┴────────────────────→┴────────────────────→┴─────────────────────→┴─────────────────────→┴──────────────────────→┴──────────────────────→┴────────────────────→┴────────────────────→┴──────────────────────→┴──────────────────────→┘ ... prefaced by simple station labels. ⍵.labels←(∪cat stats),slabs ⍝ station/stop labels. disp ⍵.labels ┌→────┬──────┬──────┬─────┬────┬───────┬─────┬───────┬───────┬────────────────────┬────────────────────┬─────────────────────┬─────────────────────┬─────────────────────┬─────────────────────┬────────────────────┬────────────────────┬───────────────────┬───────────────────┬───────────────────────┬───────────────────────┬─────────────────────┬─────────────────────┬──────────────────────┬──────────────────────┬───────────────────────┬───────────────────────┬─────────────────────┬─────────────────────┬───────────────────────┬───────────────────────┐ │ │ │ │ │ │ │ │ │ │┌→───┬─────┬─┬─────┐│┌→───┬─────┬─┬─────┐│┌→───┬──────┬─┬─────┐│┌→───┬──────┬─┬─────┐│┌→───┬──────┬─┬─────┐│┌→───┬──────┬─┬─────┐│┌→───┬─────┬─┬─────┐│┌→───┬─────┬─┬─────┐│┌→───┬────┬─┬─────┐│┌→───┬────┬─┬─────┐│┌→───┬───────┬─┬──────┐│┌→───┬───────┬─┬──────┐│┌→───┬─────┬─┬──────┐│┌→───┬─────┬─┬──────┐│┌→───┬──────┬─┬──────┐│┌→───┬──────┬─┬──────┐│┌→───┬───────┬─┬──────┐│┌→───┬───────┬─┬──────┐│┌→───┬─────┬─┬──────┐│┌→───┬─────┬─┬──────┐│┌→───┬───────┬─┬──────┐│┌→───┬───────┬─┬──────┐│ │Apple│Tomato│Banana│Grape│Pear│Spinach│Onion│Lettuce│Cabbage││ │Apple│ │Fruit│││ │Apple│ │Fruit│││ │Tomato│ │Fruit│││ │Tomato│ │Fruit│││ │Banana│ │Fruit│││ │Banana│ │Fruit│││ │Grape│ │Fruit│││ │Grape│ │Fruit│││ │Pear│ │Fruit│││ │Pear│ │Fruit│││ │Spinach│ │Veggie│││ │Spinach│ │Veggie│││ │Onion│ │Veggie│││ │Onion│ │Veggie│││ │Tomato│ │Veggie│││ │Tomato│ │Veggie│││ │Lettuce│ │Veggie│││ │Lettuce│ │Veggie│││ │Onion│ │Veggie│││ │Onion│ │Veggie│││ │Cabbage│ │Veggie│││ │Cabbage│ │Veggie││ │ │ │ │ │ │ │ │ │ │└───→┴────→┴→┴────→┘│└───→┴────→┴→┴────→┘│└───→┴─────→┴→┴────→┘│└───→┴─────→┴→┴────→┘│└───→┴─────→┴→┴────→┘│└───→┴─────→┴→┴────→┘│└───→┴────→┴→┴────→┘│└───→┴────→┴→┴────→┘│└───→┴───→┴→┴────→┘│└───→┴───→┴→┴────→┘│└───→┴──────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│└───→┴────→┴→┴─────→┘│└───→┴────→┴→┴─────→┘│└───→┴─────→┴→┴─────→┘│└───→┴─────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│└───→┴────→┴→┴─────→┘│└───→┴────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│ └────→┴─────→┴─────→┴────→┴───→┴──────→┴────→┴──────→┴──────→┴───────────────────→┴───────────────────→┴────────────────────→┴────────────────────→┴────────────────────→┴────────────────────→┴───────────────────→┴───────────────────→┴──────────────────→┴──────────────────→┴──────────────────────→┴──────────────────────→┴────────────────────→┴────────────────────→┴─────────────────────→┴─────────────────────→┴──────────────────────→┴──────────────────────→┴────────────────────→┴────────────────────→┴──────────────────────→┴──────────────────────→┘ The target namespace is returned as a shy result for use by the [trip] function. 1:shy←⍵ ⍝ shy result: namespace ref. See also: →trip← →path← →ed← →zip_cat← Back to: contents