lvec← {cols←⎕pw} ##.wrap cvec               ⍝ Wrap word vector at ⍺ columns.

The  argument  vector is split between words at [cols] (default ⎕PW) columns and
the blank replaced with a [LF] character. The resulting line-vector will display
in  the  session in [cols] or fewer columns. Words longer than [cols] are broken
unceremoniously at [cols] columns.

Technical notes:

Compare Bob Smith's amazing non-looping solution:

    wrap←{                  ⍝ ⍺-wrap (Bob Smith).
        ⍺←⎕pw               ⍝ default ⎕pw-wrap
        v←' ',⍵,' '         ⍝ blanks required at start and end
        j←(v=' ')/⍳⍴v       ⍝ indices of blanks
        p←(j+⍺+1)∘.<j       ⍝ 1s mark blanks past the cutoff
        m←p<1⌽p             ⍝ mark last blank that fits on the line
        i←(⍴m)⍴1,(1↓⍴m)⍴0   ⍝ identity matrix
        c←⌹i-m              ⍝ compute transitive closure of m
        v[c[1;]/j]←⎕ucs 13  ⍝ insert the line breaks
        1↓¯1↓v              ⍝ drop the extra blanks
    }

John Daintree suggests this version, which wraps on any of the chars '-?., ' and
returns a nested vector result:

    wrap←{⍺←⎕PW               ⍝ initialize
        ⍺≥⍴,⍵:,⊂⍵             ⍝ out if short enough
        sze←(⍵∊'-?., ')/⍳⍴⍵   ⍝ length of each choice
        len←⊃⌽(⍺≥sze)/sze     ⍝ longest length
        len←⊃(len∊sze)⌽⍺ len  ⍝ middle of word?
        (⊂len↑⍵),⍺ ∇ len↓⍵    ⍝ at valid wrap point
    }

Examples, See: Line_vectors

See also: unwrap justify squeeze
See also: cols

Back to: contents

Back to: Workspaces