[Rd] Support for user defined unary functions
Martin Maechler
maechler at stat.math.ethz.ch
Thu Mar 16 17:51:36 CET 2017
>>>>> 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
More information about the R-devel
mailing list