From maechler at stat.math.ethz.ch  Thu Mar 16 17:51:36 2017
From: maechler at stat.math.ethz.ch (Martin Maechler)
Date: Thu, 16 Mar 2017 17:51:36 +0100
Subject: [Rd] Support for user defined unary functions
In-Reply-To: <CAD6tx954cHTruRT8W0kBFob9vVZem-Cjx3cTZL6nWoz8P4dv+A@mail.gmail.com>
References: <CAD6tx95VZKQ00ESU9aqq_CBy7BNtX2_ANeaPryw+3W1RVL4vww@mail.gmail.com>
	<CADwqtCMSrO-tZktHESg0LcVqP8qAKVbAnktAZGATKug2WYb-dQ@mail.gmail.com>
	<CAD6tx954cHTruRT8W0kBFob9vVZem-Cjx3cTZL6nWoz8P4dv+A@mail.gmail.com>
Message-ID: <22730.49816.583399.930840@stat.math.ethz.ch>

>>>>> Jim Hester <james.f.hester at gmail.com>
>>>>>     on Thu, 16 Mar 2017 12:31:56 -0400 writes:

    > Gabe,
    > The unary functions have the same precedence as normal SPECIALS
    > (although the new unary forms take precedence over binary SPECIALS).
    > So they are lower precedence than unary + and -. Yes, both of your
    > examples are valid with this patch, here are the results and quoted
    > forms to see the precedence.

    > `%chr%` <- function(x) as.character(x)

  [more efficient would be     `%chr%` <- as.character]

    > `%identical%` <- function(x, y) identical(x, y)
    > quote("100" %identical% %chr% 100)
    > #>  "100" %identical% (`%chr%`(100))

    > "100" %identical% %chr% 100
    > #> [1] TRUE

    > `%num%` <- as.numeric
    > quote(1 + - %num% "5")
    > #> 1 + -(`%num%`("5"))

    > 1 + - %num% "5"
    > #> [1] -4

    > Jim

I'm sorry to be a bit of a spoiler to "coolness", but
you may know that I like to  applaud Norm Matloff for his book
title "The Art of R Programming",
because for me good code should also be beautiful to some extent.

I really very much prefer

       f(x)
to    %f% x       

and hence I really really really cannot see why anybody would prefer
the ugliness of

           1 + - %num% "5"
to
	   1 + -num("5")

(after setting  num <- as.numeric )

Martin


    > On Thu, Mar 16, 2017 at 12:01 PM, Gabriel Becker <gmbecker at ucdavis.edu> wrote:
    >> Jim,
    >> 
    >> This seems cool. Thanks for proposing it. To be concrete, he user-defined
    >> unary operations would be of the same precedence (or just slightly below?)
    >> built-in unary ones? So
    >> 
    >> "100" %identical% %chr% 100
    >> 
    >> would work and return TRUE under your patch?
    >> 
    >> And  with %num% <- as.numeric, then
    >> 
    >> 1 + - %num% "5"
    >> 
    >> would also be legal (though quite ugly imo) and work?
    >> 
    >> Best,
    >> ~G
    >> 
    >> On Thu, Mar 16, 2017 at 7:24 AM, Jim Hester <james.f.hester at gmail.com>
    >> wrote:
    >>> 
    >>> R has long supported user defined binary (infix) functions, defined
    >>> with `%fun%`. A one line change [1] to R's grammar allows users to
    >>> define unary (prefix) functions in the same manner.
    >>> 
    >>> `%chr%` <- function(x) as.character(x)
    >>> `%identical%` <- function(x, y) identical(x, y)
    >>> 
    >>> %chr% 100
    >>> #> [1] "100"
    >>> 
    >>> %chr% 100 %identical% "100"
    >>> #> [1] TRUE
    >>> 
    >>> This seems a natural extension of the existing functionality and
    >>> requires only a minor change to the grammar. If this change seems
    >>> acceptable I am happy to provide a complete patch with suitable tests
    >>> and documentation.
    >>> 
    >>> [1]:
    >>> Index: src/main/gram.y
    >>> ===================================================================
    >>> --- src/main/gram.y     (revision 72358)
    >>> +++ src/main/gram.y     (working copy)
    >>> @@ -357,6 +357,7 @@
    >>> |       '+' expr %prec UMINUS           { $$ = xxunary($1,$2);
    >>> setId( $$, @$); }
    >>> |       '!' expr %prec UNOT             { $$ = xxunary($1,$2);
    >>> setId( $$, @$); }
    >>> |       '~' expr %prec TILDE            { $$ = xxunary($1,$2);
    >>> setId( $$, @$); }
    >>> +       |       SPECIAL expr                    { $$ = xxunary($1,$2);
    >>> setId( $$, @$); }
    >>> |       '?' expr                        { $$ = xxunary($1,$2);
    >>> setId( $$, @$); }
    >>> 
    >>> |       expr ':'  expr                  { $$ =
    >>> xxbinary($2,$1,$3);      setId( $$, @$); }
    >>> 
    >>> ______________________________________________
    >>> R-devel at r-project.org mailing list
    >>> https://stat.ethz.ch/mailman/listinfo/r-devel
    >> 
    >> 
    >> 
    >> 
    >> --
    >> Gabriel Becker, PhD
    >> Associate Scientist (Bioinformatics)
    >> Genentech Research

    > ______________________________________________
    > R-devel at r-project.org mailing list
    > https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] Support for user defined unary functions
Martin Maechler