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: Elias Mårtenson
Subject: Re: [Bug-apl] Not a bug, need help coding search&replace on a vector
Date: Thu, 23 Jun 2016 20:33:41 +0800

As strange as it may seem, the parenthesed _expression_ returns an operator, which is then applied to the function on the left.

GNU APL does not support first-class functions (and operators) so this syntax is not an option for us.

Regards,
Elias

On 23 Jun 2016 8:08 pm, "Louis Chretien" <address@hidden> wrote:
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 <address@hidden> 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 <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.
    >>>
    >>>
    >>>
    >>>
    >>>
    >>>
    >>







---
Louis Chrétien





reply via email to

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