That's easily fixed:
Curry<- function(FUN, ...) {
args<- match.call(expand.dots = FALSE)$...
args$...<- as.name("...")
env<- parent.frame()
if (is.name(FUN)) {
fname<- FUN
} else if (is.character(FUN)) {
fname<- as.name(FUN)
} else if (is.function(FUN)){
fname<- FUN
# env$FUN<- FUN
} else {
stop("FUN not function or name of function")
}
curry_call<- as.call(c(list(fname), args))
f<- eval(call("function", as.pairlist(alist(... = )), curry_call))
environment(f)<- env
f
}
Curry(Curry(foo,3),4)
e.g.:
foo=function(x,y,z) x+y+z
Curry(Curry("foo",3),4)(3)
# 10
Curry(Curry(foo,3),4)(3)
# hangs
foo4=function(a,b,c,d)
Curry(Curry(Curry("foo4",3),4),1)(3)
# hangs
I was also curious if there was some trick to force a function eval when the
list of arguments got exhausted (for example, a triple Curry on foo above
would leave no arguments so would trigger eval into 10).
I don't think that would be a good idea - there's a big difference
between a function with no arguments and the result of calling that
function.
Hadley