From james.f.hester at gmail.com  Thu Mar 16 17:31:56 2017
From: james.f.hester at gmail.com (Jim Hester)
Date: Thu, 16 Mar 2017 12:31:56 -0400
Subject: [Rd] Support for user defined unary functions
In-Reply-To: <CADwqtCMSrO-tZktHESg0LcVqP8qAKVbAnktAZGATKug2WYb-dQ@mail.gmail.com>
References: <CAD6tx95VZKQ00ESU9aqq_CBy7BNtX2_ANeaPryw+3W1RVL4vww@mail.gmail.com>
	<CADwqtCMSrO-tZktHESg0LcVqP8qAKVbAnktAZGATKug2WYb-dQ@mail.gmail.com>
Message-ID: <CAD6tx954cHTruRT8W0kBFob9vVZem-Cjx3cTZL6nWoz8P4dv+A@mail.gmail.com>

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)
    `%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

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



[Rd] Support for user defined unary functions
Jim Hester