bug-apl
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Bug-apl] Not a bug, need help coding search&replace on a vector


From: Xiao-Yong Jin
Subject: Re: [Bug-apl] Not a bug, need help coding search&replace on a vector
Date: Tue, 21 Jun 2016 21:35:59 -0500

At some point I really wanted to implement the simplest editor, namely ed (it 
would be much better than any APL system has offered), in APL, but I never 
finished the regex part.  Perhaps it would be a nice exercise for someone who’s 
interested in learning APL to actually implement some of the most used Unix 
command line utilities.

> On Jun 21, 2016, at 8:53 PM, Christian Robert <address@hidden> wrote:
> 
> Hi,
> 
> A more general purpose search&replace (some bug fixed), take (2), was "snr".
> 
> 
> 
>      )sic
>      )erase replace
>      ∇z←s replace p;fr;to;P;i;⎕io
> ⍝ -------------
> →(2≤≡s)/ForEach
> →(2≤⍴⍴s)/Matrix
> →Vector
> ⍝ -------------
> ForEach: z←{⍵ replace p}¨s ◊ →0
> Matrix: z←⊃ {⍵ replace p}¨ ⊂[2]s ◊ →0
> ⍝ -------------
> Vector: p←,¨p ◊ z←s←,s ⋄ ⎕io←1
> Loop:→((⍴p)<2)/0
> (fr to)←2↑p ◊ p←2↓p
> P←¯1↓∧/[1](¯1+⍳⍴fr)⌽fr∘.=z,⎕ucs 1
> i←0
> Sanitize: i←i+1
> →(i>(⍴P)-⍴fr)/Substitute
> →(0=P[i])/Sanitize
> ((⊂ i+¯1+⍳⍴fr)⌷P)←(⍴fr)↑1
> →Sanitize
> Substitute: P←⌽(P/⍳⍴P)
> ⊣ {z←((¯1+⍵)↑z),to,(¯1+⍵+⍴fr)↓z}¨P
> →Loop
>
> 
> It should be vector, matrix and embedded objects "aware" (as long as it is 
> all text)
> 
> Syntax:
> 
>  source replace "this" "by_that" "this" "by_that" [...]  (eg: pairs of "from" 
> and "to")
> 
> Examples:
> 
>      (⎕cr 'replace') replace 'replace' 'snr' 'ForEach' "Each" "Substitute" 
> "Subst" "Sanitize" "Sane"
> z←s snr p;fr;to;P;i;⎕io
> ⍝ -------------
> →(2≤≡s)/Each
> →(2≤⍴⍴s)/Matrix
> →Vector
> ⍝ -------------
> Each: z←{⍵ snr p}¨s ◊ →0
> Matrix: z←⊃ {⍵ snr p}¨ ⊂[2]s ◊ →0
> ⍝ -------------
> Vector: p←,¨p ◊ z←s←,s ⋄ ⎕io←1
> Loop:→((⍴p)<2)/0
> (fr to)←2↑p ◊ p←2↓p
> P←¯1↓∧/[1](¯1+⍳⍴fr)⌽fr∘.=z,⎕ucs 1
> i←0
> Sane: i←i+1
> →(i>(⍴P)-⍴fr)/Subst
> →(0=P[i])/Sane
> ((⊂ i+¯1+⍳⍴fr)⌷P)←(⍴fr)↑1
> →Sane
> Subst: P←⌽(P/⍳⍴P)
> ⊣ {z←((¯1+⍵)↑z),to,(¯1+⍵+⍴fr)↓z}¨P
> →Loop
> 
> 
> You can even try "⎕fx" the result if it looks like Ok. (ps: always check the 
> result before committing)
> 
> Substitutions are done in pair sequence for each /vector/matrix/embedded obj.
> 
> So replace order is *very* important.
> 
> It must still have some bugs, report them to me, with examples if so. Will do 
> my best but no promises.
> 
> Purpose: well, not sure, it was an exercise. I used it on itself to finally 
> rename the function and change some variables/labels names.
> 
> 
> Features: would be fun to pass parameters to each of the /from/to/ like 
> maximum number of substitutions to do per line ...
>          whole words only (taking apl characters as blanks) ... so variable 
> "s" won't match last character of variable "pairs"
>          ... no limits
> 
> 
> Xtian.
> 
> 
> On 2016-06-21 12:27, Juergen Sauermann wrote:
>> Hi Xtian,
>> 
>> how about this:
>> 
>> *      
>> **s←"444This4is4a4444test44with44444lot4of4blanks4444at4beginning4and444end444444"**
>>      from←"444"**
>> **      to←"5"**
>> **
>> **      ↑⍎')HOST echo "',s,'" | sed s/',from,'/',to,'/g'**
>> **5This4is4a54test44with544lot4of4blanks54at4beginning4and5end55**
>> **  **
>> *I have replaced the *^* in your example because it (and some other 
>> characters) have a special meaning in
>> regular expressions. But the special characters can be easily quoted in APL 
>> if needed, for example:
>> 
>> *      
>> s←"^^^This^is^a^^^^test^^with^^^^^lot^of^blanks^^^^at^beginning^and^^^end^^^^^^"
>>  **
>> **      ((s='^')/s)←⊂'\^'**
>> **      ⊃,/s**
>> **\^\^\^This\^is\^a\^\^\^\^test\^\^with\^\^\^\^\^lot\^of\^blanks\^\^\^\^at\^beginning\^and\^\^\^end\^\^\^\^\^\^**
>> *
>> /// Jürgen
>> 
>> 
>> On 06/21/2016 05:12 AM, Christian Robert wrote:
>>> Hi, it's not a bug but a request for help,
>>> 
>>> 
>>> suppose 
>>> s="^^^This^is^a^^^^test^^with^^^^^lot^of^blanks^^^^at^beginning^and^^^end^^^^^^"
>>> suppose from="^^^"
>>> suppose to="^"
>>> 
>>> I need a function who can replace ("^^^" to "^"), or ("^" to "^^^^^^^^") or 
>>> ("" to "blabla" with limits of source size)  ie: without being lost in 
>>> infinite loop.
>>> 
>>> 
>>> 
>>> "s" is a character vector, "from" is a character vector, and "to" is a 
>>> character vector,
>>> both "s", "from" and "to" can be "".
>>> 
>>> 
>>> 
>>> I'm pretty sure this idiom already exist.
>>> 
>>> if you can help me, please do.
>>> 
>>> Xtian.
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]