Sharpening your APL knife
References
References -1-
- v←(⎕wa-1000)⍴'a'
- copy←v
- ⍝ No WS FULL because it is a pointer so far
- copy[2]←'b'
- WS FULL
- ⍝ Kind of reference, but hidden from the user
References -2-
- 'MyNamespace' ⎕ns ''
- MyNamespace.vars←'APL'
- namespaceRef←MyNamespace
- ⍝ This is a completely new datatype
- MyNamespace.vars←'APL forever'
- namespaceRef.vars
- APL forever
- namespaceRef.vars←¯2↓namespaceRef.vars
- MyNamespace.vars
- APL forev
References -3-
- )LOAD Course_01
- )cs #.NamespaceRefs
- List
References -4-
- )LOAD Course_01
- )cs #.NamespaceRefs
- 4↑ns1 ns2
- NONCE ERROR
- ⍝ The prototype is undefined
References -5-
- )LOAD Course_01
- )cs #.NamespaceRefs
- ns1 ≡ ns1
- 1
- ns1 ≡ ns2
- 0
- n1_2←ns1 ⍝ n1_2 is a reference pointing to n1
- ns1 ≡ n1_2
- 1
References -6-
- )LOAD Course_01
- )cs #.NamespaceRefs
- ⍴ns1
-
- ≡ns1
- 0
- ⎕nc¨ 'ns1' (⊂'ns1')
- 9 9.1
Unnamed Namespaces -1-
The monadic call of []NS creates a new, unique unnamed namespace and returns a ref to it
- ⎕←ref←⎕ns ''
- #.[Namespace]
- ref.(firstname lastname)←'George' 'Bush'
- ref.(net vat)←1100 .19
- ref.(gross←net+net× vat)
- ref.gross
- 1309
Unnamed Namespaces -2-
- more←⎕ns ''
- more.(firstname lastname)←'Bill' 'Clinton'
- employes←ref more
- ⎕nc 'employes'
- 2 ⍝ holds references, but is an ordinary variable
- employes[1].firstname
- George
- employes.firstname
- George Bill
References -7-
- (1⊃employes).firstname
- George
- ⍴¨(ref more).⎕NL 2
- 5 9 2 9
- ref.⎕nl more.⎕nl ←→ (ref more).⎕NL
- ⍴¨(ref more).⎕NL 2 3
- 5 9 0 0
- (ref.⎕nl 2) (more.⎕nl 3) ←→ (ref more).⎕NL 2 3
References -8-
- (1⊃employes).firstname←'Tim'
- employes.(firstname lastname)←('Tim' 'Henman')('Roger' 'Federer')
- employes.(firstname lastname)
- Tim Henman Roger Federer
References -9-
- )LOAD Course_01
- )cs #.NamespaceRefs
- (ns1 ns2).Hello⊂'APL'
- hello1 APL hello2 APL
References: identify by program
Currently, Dyalog APL lacks a system function that identifies a reference as such
- isReference←{
- ⍝ ⍵ must be a string representing a ref or a name
- name←{'#'=1⍴⍵:⍵ ⋄ (1⊃⎕NSI),'.',⍵}⍵
- 9≠⎕NC name:0
- ref←⍎⍵
- name≢⍕ref
- }
References: Examples -1-
Task: edit all functions "Make" in all sub-namespaces
- )Load S5
- )cs #.AdvancedCourse
- ⍎¨↓⎕nl 9
- #.AdvancedCourse.dfns #.AdvancedCourse.Assumptions...
- {⍵.⎕ed 'Make'}¨⍎¨↓⎕nl 9
End