This works the same way as `?` is defined in R code, and `-`, `+` (defined in C) do now, you define one function that handles calls with both unary and binary arguments.
quote(a %f% %f% b) #> a %f% (`%f%`(b)) `%f%` <- function(a, b) if (missing(b)) { force(a); cat("unary\n") } else { force(a);force(b);cat("binary\n") } a <- 1 b <- 2 a %f% %f% b #> unary #> binary This also brings up the point about what happens to existing user defined functions such as `%in%` when they are used as unary functions (likely by mistake). Happily this provides a useful error when run assuming no default value of the second argument. %in% a #> Error in match(x, table, nomatch = 0L) : #> argument "table" is missing, with no default On Thu, Mar 16, 2017 at 7:13 PM, Duncan Murdoch <murdoch.dun...@gmail.com> wrote: > I don't have a positive or negative opinion on this yet, but I do have a > question. If I define both unary and binary operators with the same name > (in different frames, presumably), what would happen? > > Is "a %chr% b" a syntax error if unary %chr% is found first? If both might > be found, does "a %chr% %chr% b" mean "%chr%(a, %chr% b)", or is it a syntax > error (like typing "a %chr%(%chr%(b))" would be)? > > Duncan Murdoch > > > > > > On 16/03/2017 10:24 AM, Jim Hester 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 >> > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel