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