⍝ Remove comment from line of APL:

    ⎕ml←0

    display ⎕cr'rmcm'
┌→──────────────────────────────────────────────────────────────────────┐
↓rmcm←{                          ⍝ APL source with comments removed.    │
│    cm←∨\(⍵='⍝')>≠\⍵=''''       ⍝ mask of comments.                    │
│    ⎕UCS(cm×32)+(~cm)×⎕UCS ⍵    ⍝ blanks for comments in source matrix.│
│}                                                                      │
└───────────────────────────────────────────────────────────────────────┘
    display rmcm ⎕cr'rmcm'
┌→──────────────────────────────────────────────────────────────────────┐
↓rmcm←{                                                                 │
│    cm←∨\(⍵='⍝')>≠\⍵=''''                                              │
│    ⎕UCS(cm×32)+(~cm)×⎕UCS ⍵                                           │
│}                                                                      │
└───────────────────────────────────────────────────────────────────────┘

    dup←{       ⍝ blah, blah,
                ⍝ blah, blah,

        ⍵ ⍵     ⍝ blah, blah,

                ⍝ blah, blah.

                ⍝ (c) C-A.S.
    }

    clean_fn←{⎕fx(dtb∘rmcm¨⎕nr ⍵)~⊂''}  ⍝ remove white space from function

    clean_fn'dup'                       ⍝ remove comments and blank lines

    display ⎕cr'dup'                    ⍝ uncommented function
┌→──────────┐
↓dup←{      │
│        ⍵ ⍵│
│    }      │
└───────────┘

    one_liner←{                         ⍝ Turn function into 1-liner.
        ⎕FX↑,↓{                         ⍝ fix:
            bd←'{⋄' '{'                 ⍝ brace-diamond → brace
            db←'⋄}' '}'                 ⍝ diamond-brace → brace
            ↑subs/bd db ⍵               ⍝ substitution in
        }↑{⍺,'⋄',⍵}/⎕NR ⍵               ⍝ diamond-joined lines.
    }

    display ⎕cr one_liner clean_fn'display'
┌→──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
↓display←{⎕IO ⎕ML←0 1 ⋄ box←{vrt hrz←(¯1+⍴⍵)⍴¨'│─' ⋄ top←'─⊖→'[¯1↑⍺],hrz ⋄ bot←(⊃⍺),hrz ⋄ rgt←'┐│',vrt,'┘' ⋄ lax←'│⌽↓'[¯1↓1↓⍺],¨⊂vrt ⋄ lft←⍉'┌',(↑lax),'└' ⋄ lft,(top⍪⍵⍪bot),rgt ⋄ } ⋄ deco←{⍺←type open ⍵ ⋄ ⍺,axes ⍵} ⋄ axes←{(-2⌈⍴⍴⍵)↑1+×⍴⍵} ⋄ open←{16::(1⌈⍴⍵)⍴⊂'[ref]' ⋄ (1⌈⍴⍵)⍴⍵} ⋄ trim←{(~1 1⍷∧⌿⍵=' ')/⍵} ⋄ type←{{(1=⍴⍵)⊃'+'⍵}∪,char¨⍵} ⋄ char←{⍬≡⍴⍵:'─' ⋄ (⊃⍵∊'¯',⎕D)⊃'#~'}∘⍕ ⋄ line←{(6≠10|⎕DR' '⍵)⊃' -'} ⋄ {0=≡⍵:' '⍪(open ⎕FMT ⍵)⍪line ⍵ ⋄ 1 ⍬≡(≡⍵)(⍴⍵):'∇' 0 0 box ⎕FMT ⍵ ⋄ 1=≡⍵:(deco ⍵)box open ⎕FMT open ⍵ ⋄ ('∊'deco ⍵)box trim ⎕FMT ∇¨open ⍵ ⋄ }⍵}│
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

⍝ JoHo's expression to remove comments from all trad- and dfns and operators:

    ⎕cr¨'gcd' 'osc'                     ⍝ before: commented fns
┌──────────────────────────────────────┬─────────────────────────────────────────────────────┐
│gcd←{       ⍝ Greatest common divisor.│osc←{               ⍝ Oscillate - probably returns 1.│
│    ⍵=0:|⍺                            │    1=⍵:1                                            │
│    ⍵ ∇ ⍵|⍺                           │    2|⍵:∇ 1+3×⍵                                      │
│}                                     │        ∇ ⍵÷2                                        │
│                                      │}                                                    │
└──────────────────────────────────────┴─────────────────────────────────────────────────────┘

    pco←⊢     ⍝ pco has a very large ⎕CR; zap it to reduce test time.

    rmcm(refs ⎕this).{⍺⍺{0=⍴⍵: ⋄ ⎕fx∘⍺⍺∘⎕cr¨⍵}⎕nl-,⍵∘.+0.1 0.2}⊂3 4

    ⎕cr¨'gcd' 'osc'                     ⍝ after: uncommented fns
┌───────────┬───────────────┐
│gcd←{      │osc←{          │
│    ⍵=0:|⍺ │    1=⍵:1      │
│    ⍵ ∇ ⍵|⍺│    2|⍵:∇ 1+3×⍵│
│}          │        ∇ ⍵÷2  │
│           │}              │
└───────────┴───────────────┘

⍝∇ rmcm display gcd osc dtb subs refs

Back to: code

Back to: Workspaces