>>>>> Jim Hester <james.f.hes...@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 <gmbec...@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.hes...@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@r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-devel >> >> >> >> >> -- >> Gabriel Becker, PhD >> Associate Scientist (Bioinformatics) >> Genentech Research > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel