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: Christian Robert
Subject: Re: [Bug-apl] Not a bug, need help coding search&replace on a vector
Date: Tue, 21 Jun 2016 23:51:03 -0400
User-agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1

On 2016-06-21 23:30, Xiao-Yong Jin wrote:
Here is the dyalog ⎕R (replace), you can find ⎕S too.  It’s a nice interface, 
but not easy to remember everything.
http://help.dyalog.com/14.1/Content/Language/System%20Functions/r.htm

That's a *lot* more than what we need. I think.

But a good ending point if ever.

Xtian.



On Jun 21, 2016, at 10:10 PM, Christian Robert <address@hidden> wrote:

Oh yes, would be nice. (pcre would be as nice as regex, may be more)

make it a ⎕regex or ⎕pcre so, no need to load a specific .so file or )lib to 
use it ;-)

Ideal would be to be able to not only scan but be able to compile a pcre, find 
patterns, search & replace ...

I am dreaming, but still awake ...

Xtian.


On 2016-06-21 22:39, Elias Mårtenson wrote:
Would anyone be interested if I actually implemented support regex by calling 
into the C library?

I'm envisioning something like this:

*      "^([a-z]+):([0-9]+)$" regex∆scan "foo:123"*
┏→━━━━━━━━━━┓
┃"foo" "123"┃
┗∊━━━━━━━━━━┛

Regards,
Elias

On 22 June 2016 at 10:35, Xiao-Yong Jin <address@hidden 
<mailto:address@hidden>> wrote:

   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<mailto: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]