{excl←'⍵'} ##.wsdiff (wsa wsb) ⍝ Workspace differences. Saved workspaces [wsa] and [wsb] are located using WSPATH, and any differences are displayed in the session (the function returns no explicit result). Lines that are in one workspace, but not in the other are displayed "split-screen". Note that wsdiff does not detect differences that amount to a _re-ordering_ or _duplication_ of lines within a function or variable. [wsdiff] is a good candid- ate for copying into a utility namespace in ⎕SE for reference via ⎕PATH or invocation using a programmable function (PF) key: see →PF_keys←. By default, functions named [wsdiff] are excluded from the comparison. This means that [wsdiff] may be copied into the active workspace and called without reporting its presence as a difference. A workspace name of: '' refers to the current active workspace. A simple vector right argument 'wsid' is short for: '' 'wsid'. A null right argument '', is short for: '' ⎕wsid. For example: wsdiff 'max' 'min' ⍝ compare two saved workspaces. wsdiff 'dfns.bak' ⍝ compare active workspace with saved workspace. wsdiff '' ⍝ compare active workspace with saved version. The optional left argument is a character vector exclusion list: '⍝' Exclude function/operator comments from comparison. ' ' Exclude function/operator white space from comparison. '~' Ignore variables. '∇' Ignore functions and operators. '⍵' Ignore functions called 'wsdiff' (default). '⎕' Discard output of differences - show only object names. Variables, if included are compared "line by line". Technical notes: A complication arises in wsdiff, with trapping the DOMAIN ERROR resulting from a mis-spelling of one of the workspace names. Wsdiff must copy ⎕TRAP from each subject workspace in order to compare the values. As error-guards are imple- mented using ⎕TRAP, the incoming value _overwrites_ the error-guard. In itself, this doesn't cause a problem as by this time, the error-guard's job is done. However, when the error-guard goes out of scope, the incoming value of ⎕TRAP is lost. The solution is to pass back the _value_ of the incoming ⎕TRAP along with any other workspace-wide variables, as part of the result of the copy function. A related problem occurs with using ⍎ to determine the values of variables in the respective workspaces. An "external execute" operand function is used so that subject names do not clash with local names in wsdiff. However, executing the subject name should be protected with an error guard; an example might be a VALUE ERROR for an unitialised external variable. Again, ⎕TRAP causes a problem, as its value will be changed by setting the error guard prior to the execute. In this case the code-around is to extract ⎕TRAP's value explicitly; this is easy as ⎕TRAP has the same value, workspace-wide. Bugs: [wsdiff] ignores differences in arrays that contain references to namespaces. Examples: ' 'wsdiff'c:\dyalog82\ws\patch' 'c:\dyalog90\ws\patch' ⍝ ignoring blanks. Patch.Config.GET· · · · · · │Patch.Config.GET· · · · · · · :If '8'=⊃2⊃'.'⎕WG'APLVersion' · │· :If '7'=⊃2⊃'.'⎕WG'APLVersion' · Patch.Config.PUT· · · · · · │Patch.Config.PUT· · · · · · · :If '8'=⊃2⊃'.'⎕WG'APLVersion' · │· :If '7'=⊃2⊃'.'⎕WG'APLVersion' · Patch.P · · · · · · · · │· · · · · · · · · · · ·8.1.4 (DV)· 23·Dec·1999 1955328 │· · · · · · · · · · · ·8.1.4 (RT)· 23·Dec·1999 1955328 │· · · · · · · · · · Patch.PATCHABLES· · · · · · │Patch.PATCHABLES· · · · · · · ·8.2.2 (DV)· 23·Dec·1999 2260992 │· ·9.0.1 (DV)· 18·Aug·2000 2692608 · ·8.2.2 (RT)· 23·Dec·1999 2260992 │· ·9.0.1 (RT)· 18·Aug·2000 2692608 · · · · · · · · · · │· ·8.2.3 (DV)· 17·Aug·2000 2270720 · · · · · · · · · · │· ·8.2.3 (RT)· 17·Aug·2000 2270720 · · · · · · · · · · │· ·7.4.2 (DV)· 17·Aug·2000 2185036 · · · · · · · · · · │· ·7.4.2 (RT)· 17·Aug·2000 2184976 Patch.SHOWMSG · · · · · · │Patch.SHOWMSG · · · · · · · :If 0=⎕NC M · · · · · · │· :If 9≠⎕NC M · · · · · · · · · · · · · · · · │· :OrIf 'Text'≢M ⎕WG'Type'· · · Patch.UPDATE_PROGRESS · · · · │Patch.UPDATE_PROGRESS · · · · · M ⎕WC'Static'POS(18 200)('3D' 'Rece│· M ⎕WC'Static'POS(18 200)('EdgeStyle '⎕'wsdiff'max' 'min' ⍝ Discarding output lines. ⎕LX · · · · · · · · · │⎕LX · · · · · · · · · · · · · · · · · · · │combo · · · · · · · · compile · · · · · · · · │compile · · · · · · · · const · · · · · · · · │· · · · · · · · · · defn· · · · · · · · · │defn· · · · · · · · · equn· · · · · · · · · │· · · · · · · · · · extend · · · · · · · · │· · · · · · · · · · · · · · · · · · · · │format · · · · · · · · lambda · · · · · · · · │· · · · · · · · · · local · · · · · · · · │· · · · · · · · · · max · · · · · · · · · │· · · · · · · · · · · · · · · · · · · · │min · · · · · · · · · parse · · · · · · · · │parse · · · · · · · · reduce · · · · · · · · │reduce · · · · · · · · show· · · · · · · · · │· · · · · · · · · · · · · · · · · · · · │trace · · · · · · · · trees · · · · · · · · │trees · · · · · · · · type· · · · · · · · · │· · · · · · · · · · typex · · · · · · · · │· · · · · · · · · · unify · · · · · · · · │· · · · · · · · · · · · · · · · · · · · │Background · · · · · · · Example · · · · · · · · │Example · · · · · · · · Implementation · · · · · · │· · · · · · · · · · Introduction· · · · · · · │Introduction· · · · · · · wsdiff'aaa' 'bbb' ⍝ system variable differences. ⎕TRAP · · · · · · · · │⎕TRAP · · · · · · · · · · 11·C aaa · · · · · · │· · 12·C bbb · · · · · · ⎕IO · · · · · · · · · │⎕IO · · · · · · · · · · 1 · · · · · · · · │· 0 · · · · · · · · wsdiff'' ⍝ changes since )load. notes.wsdiff· · · · · · · │notes.wsdiff· · · · · · · · A workspace name·of:·'' refers to t│· A workspace·name of: ''·refers to · A simple·vector right argument 'wsi│· argument·of is shorthand·for: ''·⎕w · A null right·argument '', is·short │· · wsdiff 'max'·'min' · ⍝ compa · For example:· · · · · · │· · wsdiff '' 'dfns.bak'· ⍝ compa · · wsdiff 'max'·'min' ⍝ compare t│· · wsdiff '' · · · ⍝ compa · · wsdiff 'dfns.bak' ⍝ compare a│· · · · · · · · · · · · wsdiff '' · · ⍝ compare a│· · · · · · · · · · wsdiff · · · · · · · · │wsdiff · · · · · · · · · · · wsv←,'⎕LX' '⎕TRAP' · · │· · · wsv←,'⎕LX' '⎕TRAP' · ⍝ '⎕S · · · ⎕LX←'' · · · · · │· · · ⎕LX←'' ⍝⋄ ⎕SM←0 3⍴0 · · wsdiff'aaa' 'ccc' ⍝ Error trapping for bad wsname. Can't copy: ccc wsdiff'aaa' 'ccc' ∧ See also: fndiff refws Workspaces PF_keys Back to: contents Back to: Workspaces