Since Dyalog has created those ⎕R and ⎕S, it might be a good starting point.
But i am always baffled by the syntax of using parenthesis to group on the
function on the left and have it applied to the right argument, like Dialog
shows on their webpage:
R←{X} (A ⎕R B) Y
> On Jun 22, 2016, at 14:12, Juergen Sauermann <[email protected]>
> wrote:
>
> Hi,
>
> I believe regular expressions would be a useful and reasonable thing and I
> would
> not object to making it a ⎕-function. I can provide the framework for the
> ⎕-part of
> it (class definition, parser etc) if somebody wants to fill in the rest.
>
> I would need to know its name, and how it is called (monadic, dyadic, axis,
> function
> argument(s) etc).
>
> Please also provide a testcase file to check if (and demonstrate how) it
> works.
>
> /// Jürgen
>
>
> On 06/22/2016 05:41 AM, Elias Mårtenson wrote:
>> Sure, that shouldn't be a problem at all.
>>
>> Regards,
>> Elias
>>
>> On 22 June 2016 at 11:10, Christian Robert <[email protected]
>> <mailto:[email protected]>> 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 <[email protected]
>> <mailto:[email protected]> <mailto:[email protected]
>> <mailto:[email protected]>>> 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
>> <[email protected] <mailto:[email protected]>
>> <mailto:[email protected] <mailto:[email protected]>>>
>> 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.
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>
>> >>
>>
>>
>>
>>
>
---
Louis Chrétien
[email protected]